Mockito可以模拟类对象调用真正的方法吗?

时间:2015-12-16 01:57:34

标签: java unit-testing junit mockito

您好我有一个模拟类,对于大多数成员我不介意它返回默认值但是可能有一些方法我希望模拟类对象使用真实方法,你如何配置这个测试? e.g。

public class MyClass {
    public int func1() {
        return 1;
    }
    public int func2() {
        return 2;
    }
    public int run() {
        return func1() + func2();
    }
}

public class MyTest {
    @Mock private MyClass mockedClass
    @Before public void setup() {initMocks(this);}
    @Test public void test() {
        int result = mockedClass.func2();//I want the real func2() to run
        assertEquals(2, result);
        result = mockedClass.run();//I want the real run() and func2() to run
        assertEquals(2, result);
    }
}

我不想使用间谍,因为我必须为设置,因为我不关心所有这些方法。

1 个答案:

答案 0 :(得分:2)

在评论中提到的user3707125,您可以使用thenCallRealMethoddoCallRealMethod,但要注意,当调用模拟(而不是间谍)时,它会调用真实方法在尚未初始化的实例上

这意味着所有字段都将为null,包括final字段,并且您放入构造函数的任何初始化都不会发生。如果方法取决于任何状态,这使得它成为一个糟糕的选择,如果您调用的真实方法是您的被测单位,那么这是一个非常糟糕的选择。

除非你的方法是有效的静态方法,或者委托你使用Mockito存根的实例方法,否则你可能会发现只在正确初始化的间谍上调用真实方法更安全。