Junit Mockito не издевается, как ожидалось

#java #unit-testing #junit #mockito

#java #модульное тестирование #junit #mockito

Вопрос:

Я пытаюсь написать модульное тестирование, высмеивая некоторые методы. Однако я столкнулся с некоторой проблемой, в которой, как я полагаю, один из объектов не подвергается издевательствам.

 class A {

   Class_C c;

   Class A(String x) {
        c = new Class_C(x);
   }

   public boolean internalMethod(String internalInput) {

       // Some Logic
       // Calls Inet4Address.getByName(internalInput)
   }

   public boolean method_to_be_tested(String input) {
       boolean result_1 = internalMethod(input);
       boolean result_2 = c.someMethod(result_1);

   }
}
 

Модульный тест, который я написал, выглядит следующим образом:

  @Test
 public void test_method_to_be_tested() {

     A testObj = new A("test_input");
     testObj.c = Mockito.mock(Class_C.class);
     A spyTestObj = Mockito.spy(testObj);

     Mockito.when(spyTestObj.internalMethod(Mockito.anyString())).thenReturn(true);
     Mockito.when(spyTestObj.c.someMethod(Mockito.anyBoolean())).thenReturn(true); 

     Mockito.when(spyTestObj.test_method_to_be_tested("test_input")).thenCallRealMethod();

     Assert.assertTrue(spyTestObj.test_method_to_be_tested("test_input"));
 }
 

Ошибка, которую я получаю, указывает Inet4Address.getByName() на то, что вызывается. Этого не должно быть, поскольку я издевался над выводом метода, в котором он вызывается.

Ответ №1:

Mockito.when вызовет реальный метод. Чтобы обойти это, вы можете использовать Mockito.doReturn вместо:

 Mockito.doReturn(true).when(spyTestObj).internalMethod(Mockito.anyString());
Mockito.doReturn(true).when(spyTestObj.c).someMethod(Mockito.anyBoolean());
 

Обратите внимание, что обычно нет необходимости имитировать вызов реального метода для отслеживаемого объекта — в любом случае это поведение по умолчанию.