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);
                    }
            }
        })