Mockito mock 所有方法调用和返回

2022-09-02 11:54:18

我在用模拟编写单元测试时遇到了问题。有一个对象,我需要模拟有很多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;}

}

这就是我需要测试的服务类

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

}

那么,有没有办法避免将无用的“field1”写到“field20”的所有“时间”


答案 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()

@Test
public void testMethodNeedToTest() throws Exception {
      ObjectNeedToMock o = mock(ObjectNeedToMock.class);
      when(o.getTheImportantInt()).thenReturn("1");

      // test code goes here
}

推荐