#java #junit
Вопрос:
Я новичок в Junit и пытаюсь написать тестовый пример для следующего сценария.
public List<String> transformColumns(String action){
return action.equals("delete"))?
tableInsert("onetwo", false)
:tableInsert("onetwothree", true);
}
Если я передаю значение действия как transformColumns(«удалить»), следует вызвать метод tableInsert(«onetwo», false) со значением false во втором параметре. Как проверить значение параметра вызываемого метода в Junit?
Комментарии:
1. Почему бы вам не проверить возвращаемое значение из метода transformColumns и не оставить его на этом ? В противном случае вы проводите тест, который слишком много знает о деталях реализации. Если у метода есть побочные эффекты, убедитесь, что они тоже происходят так, как ожидалось.
2. Вы хотите использовать издевательскую библиотеку, такую как «mockito»? В нем есть методы проверки, чтобы проверить, вызывается ли метод должным образом.
3. Вы могли бы использовать Mockito ArgumentCaptor. ArgumentCaptor Как использовать: ( baeldung.com/mockito-argumentcaptor )
4. @NathanHughes Я не могу проверить на основе возвращаемого значения, потому что он не возвращает никаких данных для определения значения параметра вызываемого метода
5. Я постараюсь использовать Mockita, пожалуйста, приведите простой пример, если это возможно
Ответ №1:
Вы можете использовать Mockito, чтобы убедиться, что вызван какой-то метод. В этом случае вы можете использовать spy()
объект, который хотите протестировать , вызвать transformColumns()
метод и проверить verify()
, действительно ли tableInsert()
метод был вызван. Метод модульного тестирования может выглядеть следующим образом:
@Test
public void mockitoTest() {
Foobar mock = Mockito.spy(Foobar.class);
mock.transformColumns("delete");
Mockito.verify(mock).tableInsert(Mockito.anyString(), Mockito.eq(false));
}
Этот тест пройдет, так как вызов transformColumns("delete")
вызовет tableInsert()
метод внутренне со false
значением для второго аргумента. Если вы измените аргумент для transformColumns()
или измените ожидаемый аргумент false
на true
, вы увидите, что этот метод модульного тестирования завершится ошибкой, подобной этой (выражение Mockito.eq(true)
использовалось для отображения ошибки).:
Argument(s) are different! Wanted:
foobar.tableInsert(<any string>, true);
-> at testing.AllTests.mockitoTest(AllTests.java:14)
Actual invocations have different arguments:
foobar.transformColumns("delete");
-> at testing.AllTests.mockitoTest(AllTests.java:12)
foobar.tableInsert("onetwo", false);
-> at testing.Foobar.transformColumns(Foobar.java:8)