Mockito模拟所有方法调用并返回

jas*_*ing 16 java junit unit-testing mockito

用mock编写单元测试时遇到问题.有一个我需要模拟的对象有很多getter,我在代码中调用它们.但是,这些不是我单元测试的目的.那么,是否有一种方法可以模拟所有方法而不是逐个模拟它们.

这是代码示例:

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

}
Run Code Online (Sandbox Code Playgroud)

这是我需要测试的服务类

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

    }
}
Run Code Online (Sandbox Code Playgroud)

在测试类中,测试方法就像

@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

}
Run Code Online (Sandbox Code Playgroud)

那么,是否有一种方法可以避免将无用的"field1"的所有"when"写入"field20"

Sim*_*mY4 31

您可以控制模拟的默认答案.在创建模拟时,使用:

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);
        }
    }
}));
Run Code Online (Sandbox Code Playgroud)

  • @jasonfungsing不,你没有.在这种情况下,您将设置模拟对象的默认行为.实际上,如果你调用`doReturn(...).when()`你将用新的自定义存根覆盖这个默认行为.因此,如果您需要更改一个方法的行为而其他方法仍将返回默认值,则此选项非常有用.顺便说一句,我已经更新了我的答案. (2认同)
  • 你也可以只做 `mock(ObjectNeedToMock.class, RETURNS_DEFAULTS);` 不需要 lambda。 (2认同)