Убедитесь, что метод void был вызван внутри частного метода с помощью EasyMock/PowerMock.

У меня есть метод, который выглядит так (упрощение)

private boolean x = someMethodToSetTheValueOfX();

private void method(args){
        if(x){
             method1();
        }else{
             method2();
        }
}

Я хочу написать модульный тест, чтобы гарантировать, что когда x истинно, вызывается метод1. Я знаю, что могу использовать Whitebox PowerMock, чтобы установить значение x и вызвать метод, но как я могу подтвердить, что метод method1() был вызван? Обратите внимание, что method1() недействителен.

Мне не разрешено использовать другой фреймворк (например, Mockito), кроме EasyMock/PowerMock.


person Steve    schedule 08.06.2016    source источник
comment
На всякий случай: дайте мне знать, если вам нужна дополнительная информация, чтобы найти мой ответ полезным; в противном случае, пожалуйста, не забывайте о принятии ответов ;-)   -  person GhostCat    schedule 09.06.2016


Ответы (2)


Вы понимаете это неправильно; это не то, как вы должны разрабатывать свои тесты.

Прежде всего: будьте осторожны при использовании PowerMock... фреймворков. Они полагаются на манипуляции с байтовым кодом; и рано или поздно это вызовет проблемы. Единственная разумная ситуация для пользователя PowerMock (ito) — это когда вам нужно протестировать устаревший производственный код. В любой другой ситуации: измените свой производственный код, чтобы его можно было легко протестировать.

Тогда: не тестируйте свой код таким образом!

Вы используете насмешливую структуру для создания/управления теми объектами, которые вы передаете тестируемому классу. Вы не используете фреймворк для непосредственного тестирования тестируемого класса! Более конкретно: вы не хотите писать тестовый код, который знает о приватных методах — это детали реализации.

Что вы делаете вместо этого:

а) как сказано, вы можете использовать насмешки для передачи объектов в тестируемый класс. И затем вы можете контролировать/проверять, что эти макеты видят вызовы, которые вы ожидаете от тестируемого класса. Итак, в худшем случае вы можете поместить метод1/2 в другой объект; а затем вы можете использовать mock/verify, чтобы проверить, были ли они вызваны должным образом.

б) вы создаете тестируемые объекты вашего класса... а затем утверждаете свойства этих объектов; или по результатам, которые метод вызывает return.

person GhostCat    schedule 08.06.2016
comment
Также нельзя сказать, что с помощью PowerMock вы меняете тестируемый блок. Таким образом, вы на самом деле тестируете не свой тестируемый класс, а то, что не будет видно в рабочей среде. - person SpaceTrucker; 13.06.2016

Вы можете использовать:

System.out.println("method one was called"); 

Если вы можете печатать на консоли в среде IDE, такой как eclipse, или использовать:

JOptionPane.showMessageDialogue(null, "method one was called");

И поместите их внутрь метода1

person Dak31    schedule 08.06.2016
comment
Я думаю, вы неправильно поняли вопрос. Речь идет о модульном тестировании (например, тестах JUnit). Не об устранении неполадок. Но в противном случае да, я бы сделал первый :) - person Steve; 08.06.2016