#kotlin #testing #mockito
Вопрос:
Допустим, у меня есть эта функция:
fun method() {
val obj = Obj()
obj.callsMethod()
obj.callsOtherMethod()
}
Как я могу сделать что-то подобное для проверки(obj).callsMethod()? Есть ли какой-либо другой способ, которым я мог бы протестировать этот метод?
Комментарии:
1. Я не думаю, что это возможно. вы можете подумать о том, чтобы изменить его на
fun method(obj: Obj = Obj())
«всегда хорошо», чтобы иметь возможность «вводить» значения, если их необходимо протестировать.
Ответ №1:
У вас есть три альтернативы:
- С помощью инъекции
- Использование PowerMockito
- Рефакторинг кода в удобной для тестирования манере
С помощью инъекции
Если объект 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, а затем использовать выражение, которое вы уже знали, и это правильно.