【问题标题】:Can Mockito mocked class object calls the real method?Mockito 模拟的类对象可以调用真实的方法吗?
【发布时间】:2015-12-16 01:57:33
【问题描述】:

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

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

我不想使用 spy,因为我必须为大多数我不关心的方法设置 when

【问题讨论】:

标签: java unit-testing junit mockito


【解决方案1】:

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

这意味着所有字段都将为空,包括最终字段,并且您放入构造函数的任何初始化都不会发生。如果方法依赖于任何状态,这将使其成为一个糟糕的选择,如果您调用的真正方法是您的被测单元,那么这是一个非常糟糕的选择。

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

【讨论】:

  • 是的,很好地指出了副作用。就我而言,它是一个小助手功能,所以我仍然很好。感谢您提出这个作为答案,显然选择了你的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多