Mockito Как проверить, что экземпляр, созданный внутри метода, вызывает методы

#kotlin #testing #mockito

Вопрос:

Допустим, у меня есть эта функция:

 fun method() {
   val obj = Obj()
   obj.callsMethod()
   obj.callsOtherMethod()
}
 

Как я могу сделать что-то подобное для проверки(obj).callsMethod()? Есть ли какой-либо другой способ, которым я мог бы протестировать этот метод?

Комментарии:

1. Я не думаю, что это возможно. вы можете подумать о том, чтобы изменить его на fun method(obj: Obj = Obj()) «всегда хорошо», чтобы иметь возможность «вводить» значения, если их необходимо протестировать.

Ответ №1:

У вас есть три альтернативы:

  1. С помощью инъекции
  2. Использование PowerMockito
  3. Рефакторинг кода в удобной для тестирования манере

С помощью инъекции

Если объект Obj введен в тестируемый класс, а не был инициализирован в методе, вы сможете ввести макет, а затем использовать выражение

 verify(obj).callsMethod()
 

это вы уже знали, и это правильно.

Использование PowerMockito

С помощью powermockito вы можете написать что-то вроде этого

 @RunWith(PowerMockRunner.class)
@PrepareForTest({Obj.class})
class MyJunit{
....
@Test
public void test() throws Exception{
Obj myMock = Mockito.mock(Obj.class);
PowerMockito.whenNew(Obj.class).withAnyArguments().thenReturn(myMock);

// here your test
}
 

На этом этапе вы можете использовать выражение, которое вы уже знали, и это правильно.

Рефакторинг

Вы можете использовать protected метод для создания th Obj и имитировать этот метод в своем junit, чтобы вернуть макет версии Obj, а затем использовать выражение, которое вы уже знали, и это правильно.