如何从可测试类中模拟调用方法?

时间:2017-03-18 11:55:13

标签: java unit-testing mocking mockito

想问你一个问题。

如何从testable类调用的方法中正确返回一些数据?

例如,我有下一个结构:

Class SomeClass {
    public void method1(){
    //some logic here
    List<Object> howToReturnHereValues = gatData();
    //some logic here
    }
    public List<Object> getData(){

       return List<Object>;

    }
}

现在我想测试method1(),但我不知道如何模拟返回getData()的来电List<Object>

请问任何建议?

2 个答案:

答案 0 :(得分:2)

  

现在我想测试method1(),但我不知道如何模拟调用   getData()返回List。

模拟正在测试的类的公共方法是一个坏主意。

单元测试应测试行为和模拟依赖项。在这里,您在模拟测试类的行为时仅对行为的一部分进行单元测试。

如果班级是我们的,你可以:

  • 要么测试此方法而不模仿名为getData()的公共方法。
  • 或在另一个类中移动getData()公共方法,如果您不想在调用它的每个测试方法中重复getData()方法的测试,则模拟此新依赖项。

如果类不可修改并且确实需要模拟调用,则可以在被测对象上使用Mockito框架的spy()方法来模拟特定方法的模拟行为。

答案 1 :(得分:1)

您可以使用间谍执行此操作,如此处所述:https://static.javadoc.io/org.mockito/mockito-core/2.7.17/org/mockito/Mockito.html#13

示例:

@Test
public void testMethod1() throws Exception {
    SomeClass someClass = new SomeClass();
    SomeClass spy = Mockito.spy(someClass);
    Mockito.when(spy.getData()).thenReturn(Arrays.asList("blaat", "blabla"));
    spy.method1();
}

这将返回一个“blaat”和“blabla”列表,可以由method1中的逻辑使用。