Как проверить, какое значение передается в методе тернарного оператора в Junit?

#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)