Mockito высмеивает все методы вызова и возврата
У меня проблема при написании модульного тестирования с макетом. Есть объект, который мне нужно высмеять, есть много геттеров, которые я называю их кодом. Однако это не цель моего модульного теста. Итак, есть ли способ, которым я могу высмеять все методы, а не издеваться над ними один за другим.
Вот пример кода:
public class ObjectNeedToMock{
private String field1;
...
private String field20;
private int theImportantInt;
public String getField1(){return this.field1;}
...
public String getField20(){return this.field20;}
public int getTheImportantInt(){return this.theImportantInt;}
}
и это класс обслуживания, который мне нужно проверить
public class Service{
public void methodNeedToTest(ObjectNeedToMock objectNeedToMock){
String stringThatIdontCare1 = objectNeedToMock.getField1();
...
String stringThatIdontCare20 = objectNeedToMock.getField20();
// do something with the field1 to field20
int veryImportantInt = objectNeedToMock.getTheImportantInt();
// do something with the veryImportantInt
}
}
в тестовом классе метод тестирования аналогичен
@Test
public void testMethodNeedToTest() throws Exception {
ObjectNeedToMock o = mock(ObjectNeedToMock.class);
when(o.getField1()).thenReturn(anyString());
....
when(o.getField20()).thenReturn(anyString());
when(o.getTheImportantInt()).thenReturn("1"); //This "1" is the only thing I care
}
Итак, есть ли способ, которым я могу избежать писать все "когда" для бесполезного "поля1" в "поле20",
Ответы
Ответ 1
Вы можете контролировать ответы вашего макета по умолчанию. Когда вы создаете макет, используйте:
Mockito.mock(ObjectNeedToMock.class, new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
/*
Put your default answer logic here.
It should be based on type of arguments you consume and the type of arguments you return.
i.e.
*/
if (String.class.equals(invocation.getMethod().getReturnType())) {
return "This is my default answer for all methods that returns string";
} else {
return RETURNS_DEFAULTS.answer(invocation);
}
}
}));
Ответ 2
Если вас не интересует результат getField1()
для getField20()
в конкретном тестовом случае, вы не должны издеваться над ним вообще. Другими словами, если все конкретные тестовые getTheImportantInt()
должны быть затронуты, это getTheImportantInt()
, тогда ваш тестовый пример должен выглядеть так:
@Test
public void testMethodNeedToTest() throws Exception {
ObjectNeedToMock o = mock(ObjectNeedToMock.class);
when(o.getTheImportantInt()).thenReturn("1");
// test code goes here
}
Ответ 3
Для пользователей kotlin:
val mocked:MyClassToMock = Mockito.mock(MyClassToMock::class.java,
object:Answer<Any> {
override fun answer(invocation: InvocationOnMock?): Any {
if (String::class.java.equals (invocation?.method?.getReturnType())) {
return "Default answer for all methods that returns string";
} else {
return Mockito.RETURNS_DEFAULTS.answer(invocation);
}
}
})