Ваш тест кажется неправильным:
- Ваш юнит-тест о тестировании
ServiceLogic
зачем вы тогда его издеваетесь?
- Кроме того, у вас нет никаких ожиданий от взаимодействия с вашим
ServiceDAO
макетом.
Поскольку вопрос помечен Mockito, я предлагаю следующее решение (без импорта), которое вы можете адаптировать к своему коду:
@RunWith(MockitoJUnitRunner.class)
public class ServiceLogicTest {
@Mock ServiceDAO serviceDAO;
@InjectMocks ServiceLogic serviceLogic;
@Test
public void ensure_executeStatement_is_called_with_right_param() throws Exception {
// given
String input = "Some input";
// when
serviceLogic.getDataFrom(input);
// then
verify(serviceDAO).executeStatement("expected param");
}
}
При написании тестов мне нравится использовать стиль BDD (Behavior Driven Development), чтобы направлять меня к тому, что я хочу тестировать. Я призываю вас практиковать это, вы можете заглянуть на вики-страницу .
Итак, для вашего вопроса вы должны взглянуть на строку verify
, она переводит макет в режим проверки, поэтому может реально проверить, что метод executeStatement
действительно вызывается со значением аргумента "expected param"
.
Если у вас есть более сложные параметры, вы можете использовать некоторые сопоставители, используя библиотеку Hamcrest :
verify(serviceDAO).executeStatement(argThat(hasProperty("propertyName")));
Или вы можете использовать Mockito's ArgumentCaptor
в сочетании с FEST-Assert library (обычно мой предпочтительный подход):
ArgumentCaptor<ComplexArgument> argCaptor = ArgumentCaptor.forClass(ComplexArgument.class);
verify(serviceDAO).executeStatement(argCaptor.capture());
assertThat(argCaptor.getValue()).isNotNull().satisfies(myComplexArgumentCondition());
Основная идея состоит в том, чтобы иметь понятный код в рабочем коде и в тестовом коде.
Для дальнейшего чтения взгляните на Mockito Javadoc .