Тестирование частного метода с использованием mockito

 открытый class A {

     public void method (boolean b) {
           if (b == true)
                метод1 ();
           еще
                метод2 ();
     }

     private void method1 () {}
     private void method2 () {}
 }
 открытый class TestA {

     @Контрольная работа
     public void testMethod () {
       A a = mock (A.class);
       a.method (истина);
       // как тестировать, как verify (a) .method1 ();
     }
 }

Как тестировать частный метод называется или нет, и как тестировать частный метод с помощью mockito ???

Вы не можете сделать это с помощью Mockito, но вы можете использовать Powermock для расширения Mockito и макетов частных методов. Powermock поддерживает Mockito. Вот пример.

Невозможно с помощью mockito. Из их вики

Почему Мокито не издевается над частными методами?

Во-первых, мы не догматичны насчет насмешливых частных методов. Мы просто не заботимся о частных методах, потому что с точки зрения тестирования частных методов не существует. Вот несколько причин, по которым Мокито не издевается над частными методами:

Это требует взлома загрузчиков classов, которые никогда не являются доказательством пули, и это изменяет api (вы должны использовать собственный тестовый бегун, аннотировать class и т. Д.).

Это очень легко обойти – просто измените видимость метода от частного до защищенного пакета (или защищенного).

Это требует, чтобы я проводил время, осуществляя и поддерживая его. И это не имеет смысла, учитывая точку 2 и факт, что она уже реализована в разных инструментах (powermock).

Наконец … Издевательские частные методы – это намек на то, что с пониманием OO что-то не так. В OO вам нужны объекты (или роли) для совместной работы, а не методы. Забудьте о pascal и процедурный код. Подумайте об объектах.

Вот небольшой пример, как это сделать с помощью powermock

public class Hello { private Hello obj; private Integer method1(Long id) { return id + 10; } } 

Для тестирования метода1 используйте код:

 Hello testObj = new Hello(); Integer result = Whitebox.invokeMethod(testObj, "method1", new Long(10L)); 

Чтобы установить частный объект obj, используйте это:

 Hello testObj = new Hello(); Hello newObject = new Hello(); Whitebox.setInternalState(testObj, "obj", newObject); 

Подумайте об этом с точки зрения поведения, а не с точки зрения того, какие методы существуют. Метод, называемый method имеет конкретное поведение, если b истинно. Он имеет другое поведение, если b является ложным. Это означает, что вы должны написать два разных теста для method ; по одному для каждого случая. Поэтому вместо трех методов-ориентированных тестов (один для method , один для method 1, один для method2 , у вас есть два теста, ориентированные на поведение.

В связи с этим (я недавно предложил это в другом streamе SO и получил название из четырех букв, поэтому не стесняйтесь брать это с солью); Мне полезно выбирать имена тестов, которые отражают поведение, которое я тестирую, а не имя метода. Поэтому не называйте ваши тесты testMethod() , testMethod1() , testMethod2() и так далее. Мне нравятся имена, такие как calculatedPriceIsBasePricePlusTax() или taxIsExcludedWhenExcludeIsTrue() которые указывают, какое поведение я тестирую; то в рамках каждого тестового метода проверяйте только указанное поведение. В большинстве таких случаев будет задействован только один вызов общедоступного метода, но может включать множество вызовов для частных методов.

Надеюсь это поможет.

Вы не должны тестировать частные методы. Необходимо протестировать только не частные методы, так как в любом случае они должны вызвать частные методы. Если вы хотите проверить личные методы, это может означать, что вам нужно переосмыслить свой дизайн:

Я использую правильную инъекцию зависимостей? Возможно, мне нужно переместить частные методы в отдельный class и скорее проверить это? Должны ли эти методы быть частными? … не могут ли они быть по умолчанию или защищены?

В приведенном выше примере два метода, которые называются «случайным образом», действительно могут быть помещены в собственный class, проверены и затем введены в class выше.

Я смог проверить частный метод внутри, используя mockito, используя reflection. Вот пример, попытался назвать его таким, чтобы он имел смысл

 //Service containing the mock method is injected with mockObjects @InjectMocks private ServiceContainingPrivateMethod serviceContainingPrivateMethod; //Using reflection to change accessibility of the private method Class[] params = new Class[]{PrivateMethodParameterOne.class, PrivateMethodParameterTwo.class}; Method m = serviceContainingPrivateMethod .getClass().getDeclaredMethod("privateMethod", params); //making private method accessible m.setAccessible(true); assertNotNull(m.invoke(serviceContainingPrivateMethod, privateMethodParameterOne, privateMethodParameterTwo).equals(null)); 

Я не совсем понимаю, что вам нужно проверить частный метод. Коренная проблема заключается в том, что ваш общеansible метод недействителен как тип возврата, и, следовательно, вы не можете протестировать свой общеansible метод. Следовательно, вы вынуждены проверять свой частный метод. Я правильно понял?

Несколько возможных решений (AFAIK):

  1. Издеваясь над вашими частными методами, вы все равно не будете «на самом деле» тестировать свои методы.

  2. Проверьте состояние объекта, используемого в методе. Методы MOSTLY либо выполняют некоторую обработку входных значений, либо возвращают результат, либо изменяют состояние объектов. Также можно использовать тестирование объектов для желаемого состояния.

     public class A{ SomeClass classObj = null; public void publicMethod(){ privateMethod(); } private void privateMethod(){ classObj = new SomeClass(); } } 

    [Здесь вы можете проверить частный метод, проверив изменение состояния classObj от null до непустого.]

  3. Обновите свой код немного (надеюсь, что это не устаревший код). Мой фонд написания метода заключается в том, что всегда нужно возвращать что-то (int / boolean). Возвращаемое значение МОЖЕТ или НЕ МОЖЕТ быть использовано в реализации, но оно будет использовано при тестировании

    код.

     public class A { public int method(boolean b) { int nReturn = 0; if (b == true) nReturn = method1(); else nReturn = method2(); } private int method1() {} private int method2() {} } 

Поместите свой тест в один и тот же пакет, но в другую исходную папку (src / main / java vs. src / test / java) и сделайте эти методы закрытыми. Имоспособность более важна, чем конфиденциальность.

  • Инициализация ложных объектов - MockIto
  • Mockito Как издеваться над вызовом метода суперclassа
  • Mockito: InvalidUseOfMatchersException
  • Разница между @Mock, @MockBean и Mockito.mock ()
  • Как правильно сопоставить varargs в Mockito
  • Как использовать ArgumentCaptor для stubbing?
  • В чем разница между насмешкой и шпионажем при использовании Mockito?
  • Как проверить метод, вызывается два раза с помощью mockito verify ()
  • Как сделать издевательство над недействительными методами с mockito
  • Mockito: Пытаться шпионить за методом вызывает оригинальный метод
  • Использование PowerMockito.whenNew () не получает издевательства и вызывается оригинальный метод
  • Interesting Posts

    Какова цель регистра указателя кадров EBP?

    Как я могу выбрать элемент с несколькими classами в jQuery?

    Что может ограничить скорость передачи данных NAS?

    Преобразование в абсолютное значение в Objective-C

    Вложенные с помощью операторов в C #

    Служба Windows Windows с таймером перестает отвечать

    Как рассчитать количество дней между двумя датами

    Динамически строить вызов для поиска нескольких столбцов

    Добавление файлов в java classpath во время выполнения

    Получить строку командной строки для настройки VLC с графическим интерфейсом

    Почему мои тесты на Perl терпят неудачу с `use encoding ‘utf8’`?

    Удаление определенных дубликатов из массива Excel

    Как использовать сервер времени Интернета для получения времени?

    Есть ли способ получить идентификатор электронной почты пользователя после проверки его / ее идентификатора Twitter с помощью OAuth?

    Есть ли эмулятор консоли Windows?

    Давайте будем гением компьютера.