Подтвердить что ты не робот

Mockito - проверить двойное значение

У меня есть метод под названием method1, который принимает двойной, который вызывается в myManager Я перехожу к этому 65.888 * 60. Когда я пытаюсь проверить это, я получаю проблемы с плавающей запятой. Сбой проверки. Он ожидает 3953.28, но 3953.280029296875

verify(myManager, times(1)).method1(65.888 * 60d);

В любом случае, я могу сделать это, проверит проверку нечеткой проверки для проверки с плавающей точкой. Так же, как вы делаете с assertEquals, где вы вводите дельта в конце.

Спасибо

4b9b3361

Ответ 1

Вы можете записать значение, например.

final ArgumentCaptor<Double> captor = ArgumentCaptor.forClass(Double.class)
...
verify(myManager).method1(captor.capture());

Тогда утвердим:

assertEquals(expected, captor.getValue(), delta)

Или, возможно, используйте совпадение аргументов, которое делает утверждение:

verify(myManager).method1(doubleThat(new ArgumentMatcher<Double>() 
{
    @Override 
    public boolean matches(final Object actual)
    {
        return Math.abs(expected - (Double) actual) <= delta;
    }
}));

Обновление:

Вместо использования какого-либо из вышеперечисленных методов вы можете использовать AdditionalMatchers.eq(double, double), например:

verify(myManager).method1(AdditionalMatchers.eq(expected, delta));

Хотя используйте AdditonalMatchers разумно, согласно документации:

AdditionalMatchers предоставляют редко используемые матчи, которые сохраняются только для некоторой совместимости с EasyMock. Используйте дополнительные сочетания очень разумно, потому что они могут повлиять на читаемость теста. Рекомендуется использовать сокеты от Matchers и сохранять простые и простые проверки.

Ответ 2

Существует подходящий для Hamcrest совпадение.

org.hamcrest.Matchers.closeTo(value, error)

Итак, вы можете написать что-то вроде

verify(myManager).method1(doubleThat(org.hamcrest.Matchers.closeTo(65.888 * 60, 0.001)));

Кстати, вам не нужно писать times(1) в Mockito verify, так как это тип по умолчанию verify, который дает вам Mockito.

Ответ 3

Следующий код работает для меня:

private class MockedClass {
    public void method1(double d) {}
}

@Test
public final void testMockito() {
    MockedClass d = mock(MockedClass.class);
    d.method1(3953.28);
    verify(d, times(1)).method1(65.888 * 60d);
}

Возможно, вам стоит вместо этого вызвать метод с anyDouble() или использовать следующий Matcher: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/number/IsCloseTo.html

Ответ 4

Как насчет использования:

when(65.888).thenReturn(65.888 * 60);

assertEquals(65.888 * 60, new BigDecimal(Double.toString(65.888 * 60))
    .setScale(pRoundingDecimalPlaces, 2).doubleValue());