简体   繁体   English

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

[英]Mockito mock all methods call and return

I have a problem when writing unit testing with mock. 用mock编写单元测试时遇到问题。 There is a object which I need to mock have a lot getter, which I do call them at the code. 有一个我需要模拟的对象有很多getter,我在代码中调用它们。 However, those are not the purpose of my unit test. 但是,这些不是我单元测试的目的。 So, is there is a way I can mock all the methods instead of mock them one by one. 那么,是否有一种方法可以模拟所有方法而不是逐个模拟它们。

Here is the code example: 这是代码示例:

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

}

and this is the service class I need to test 这是我需要测试的服务类

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

    }
}

within the test class, the test method is like 在测试类中,测试方法就像

@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

}

So, is there a way that I can avoid writing all the "when" for the useless "field1" to "field20" 那么,是否有一种方法可以避免将无用的“field1”的所有“when”写入“field20”

You can control the default answers of your mock. 您可以控制模拟的默认答案。 When you're creating the mock, use: 在创建模拟时,使用:

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

If you're not interested in the result of getField1() to getField20() in a particular test case, you shouldn't mock it at all. 如果你不感兴趣的结果getField1()getField20()在一个特定的测试用例,你不应该嘲笑它。 In other words, if all the specific test case should be concerned about is getTheImportantInt() , then your test case should look like this: 换句话说,如果所有特定的测试用例都应该关注的是getTheImportantInt() ,那么你的测试用例应如下所示:

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

      // test code goes here
}

For kotlin users: 对于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);
                    }
            }
        })

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM