public class A { public void method (boolean b) { если (b == истина) method1 (); еще method2 (); } private void method1 () {} private void method2 () {} }
public class TestA { @Тест public void testMethod () { A a = mock (класс A.) a.method (истина); // как тестировать как verify (a) .method1 (); } }
Как проверить вызывается частный метод или нет, и как протестировать частный метод с помощью mockito ???
Ответы:
Вы не можете сделать это с Mockito, но вы можете использовать Powermock для расширения Mockito и имитации частных методов. Powermock поддерживает Mockito. Вот вам пример.
источник
Невозможно через mockito. Из их вики
источник
Вот небольшой пример, как это сделать с помощью powermock
Для тестирования метода 1 используйте код:
Чтобы установить частный объект obj, используйте это:
источник
Подумайте об этом с точки зрения поведения, а не с точки зрения имеющихся методов. Вызываемый метод
method
имеет особое поведение, еслиb
истинно. Еслиb
это false, он ведет себя иначе . Это означает, что вам следует написать два разных теста дляmethod
; по одному на каждый случай. Таким образом, вместо трех тестов, ориентированных на метод (один дляmethod
, один дляmethod1
, один дляmethod2
, у вас есть два теста, ориентированных на поведение.В связи с этим (я недавно предложил это в другом треде SO, и в результате меня назвали словом из четырех букв, так что не стесняйтесь относиться к этому с недоверием); Я считаю полезным выбирать имена тестов, которые отражают поведение, которое я тестирую, а не имя метода. Так что не называют тесты
testMethod()
,testMethod1()
,testMethod2()
и так далее. Мне нравятся такие имена, какcalculatedPriceIsBasePricePlusTax()
илиtaxIsExcludedWhenExcludeIsTrue()
которые указывают, какое поведение я тестирую; затем в каждом методе тестирования проверьте только указанное поведение. В большинстве случаев такое поведение будет включать только один вызов общедоступного метода, но может включать много вызовов частных методов.Надеюсь это поможет.
источник
Хотя Mockito не предоставляет такой возможности, вы можете добиться того же результата, используя Mockito + класс JUnit ReflectionUtils или класс Spring ReflectionTestUtils . См. Пример ниже, взятый отсюда, объясняющий, как вызвать частный метод:
Полные примеры с ReflectionTestUtils и Mockito можно найти в книге Mockito for Spring.
источник
Вы не должны тестировать частные методы. Необходимо тестировать только не приватные методы, так как они в любом случае должны вызывать частные методы. Если вы «хотите» протестировать частные методы, это может указывать на то, что вам нужно переосмыслить свой дизайн:
Я использую правильную инъекцию зависимостей? Возможно, мне нужно переместить частные методы в отдельный класс и проверить это? Эти методы должны быть частными? ... не могут ли они быть по умолчанию или защищены?
В приведенном выше примере два метода, которые называются «случайным образом», может потребоваться поместить в отдельный класс, протестировать и затем внедрить в класс выше.
источник
Используя отражение, частные методы можно вызывать из тестовых классов. В таком случае,
// тестовый метод будет таким ...
Если частный метод вызывает любой другой частный метод, тогда нам нужно шпионить за объектом и заглушить другой метод. Тестовый класс будет похож на ...
// тестовый метод будет таким ...
** Подход состоит в том, чтобы совместить отражение и наблюдение за объектом. ** method1 и ** method2 - это частные методы, а method1 вызывает method2.
источник
Я смог протестировать частный метод внутри, используя mockito, используя отражение. Вот пример, попытался назвать его так, чтобы было понятно
источник
Я действительно не понимаю, что вам нужно тестировать частный метод. Основная проблема заключается в том, что ваш общедоступный метод имеет void как возвращаемый тип, и, следовательно, вы не можете протестировать свой общедоступный метод. Следовательно, вы вынуждены протестировать свой частный метод. Моя догадка верна ??
Несколько возможных решений (AFAIK):
Издеваться над вашими частными методами, но вы все равно не будете «на самом деле» тестировать свои методы.
Проверьте состояние объекта, используемого в методе. В большинстве своем методы либо выполняют некоторую обработку входных значений и возвращают выходные данные, либо изменяют состояние объектов. Также можно использовать тестирование объектов на предмет желаемого состояния.
Немного отредактируйте код (надеюсь, это не устаревший код). Моя основа написания метода заключается в том, что всегда нужно что-то возвращать (int / a boolean). Возвращенное значение МОЖЕТ или НЕ МОЖЕТ использоваться реализацией, но ОБЯЗАТЕЛЬНО БУДЕТ использоваться тестом.
код.
источник
На самом деле есть способ протестировать методы частного члена с помощью Mockito. Допустим, у вас есть такой класс:
Если вы хотите, чтобы тест
a.method
вызвал метод изSomeOtherClass
, вы можете написать что-то вроде ниже.ReflectionTestUtils.setField();
закроет приватного участника чем-то, за чем вы можете шпионить.источник
Поместите свой тест в тот же пакет, но в другую исходную папку (src / main / java vs. src / test / java) и сделайте эти методы пакетными. Тестируемость Imo важнее конфиденциальности.
источник
В случаях, когда частный метод не является недействительным и возвращаемое значение используется в качестве параметра для метода внешней зависимости, вы можете имитировать зависимость и использовать
ArgumentCaptor
для захвата возвращаемого значения. Например:источник