如何使用mockito模拟静态方法



我正在为Junits 使用mockito

我知道mockito不模拟静态方法,但有没有办法代替使用powermock?

感谢

我认为可能的解决方法是在实际实例中封装静态方法。或者静态方法背后的真实实例。

尽管这意味着您必须修改生产代码。

老实说,如果你现在问自己这个问题,你在开发过程中测试代码太晚了。(现在传福音;))如果你在练习TDD,你会很早就注意到这个问题,并很早就调整了你的设计,使其可以用经典的测试软件进行完全测试。

我个人在练习TDD时会使用"疼痛指标"来判断我的设计是否合格。当然,一切都取决于上下文,但通常这是一个很好的设计指标(至少对我和其他人来说)。

所以我的建议是去掉这些静态方法,或者修改你的设计,使其不依赖于静态方法嘲讽。

干杯

不确定你在寻找什么"出路"。很多人同时使用Mockito和Powermock,我没有听说过任何关于不兼容或冲突的恐怖故事。只要在需要模拟静态方法的情况下使用Powermock就可以了。

或者重构以不使用需要嘲讽的静态方法。

不,我认为我们的PowerMock没有任何方法可以做到这一点。

但是,您可以通过引入适配器来打破对这种静态方法的依赖。

Mockito自3.4.0版本起支持mocking静态方法。它比PowerMock做得更好,因为限制了静态方法mock的范围

要使用此功能,您必须通过在测试类路径中添加以下文件来启用Mockito的内联mock-maker

/mockito-extensions/org.mockito.plugins.MockMaker

文件的内容必须是以下单行:

mock-maker-inline

完成此操作后,可以模拟final类和静态方法。

这里有一个如何模拟带参数和不带参数的静态方法的例子

public class Foo {
    public static String voidMethod() {
        return "voidMethod-return";
    }
    public static String intMethod(int x) {
        return "intMethod-return " + x;
    }
}
...
// Prepare class 'Foo' for static mocking, for the current thread: 
try (MockedStatic<Foo> mocked = Mockito.mockStatic(Foo.class)) {
        //////////
        // Mock 'Foo.voidMethod()' to return "voidMethod-mock":
        mocked.when(Foo::voidMethod).thenReturn("voidMethod-mock");
        assertEquals("voidMethod-mock", Foo.voidMethod());
        mocked.verify(Foo::voidMethod);

        //////////
        // Mock 'Foo.intMethod()' to return "intMethod-mock":
        mocked.when(() -> Foo.intMethod(10)).thenReturn("intMethod-mock 10");
        assertEquals("intMethod-mock 10", Foo.intMethod(10));
        mocked.verify(() -> Foo.intMethod(10));
} // MockedStatic.close() releases the static mock.
// The original static method is 'restored' here: 
assertEquals("voidMethod-return", Foo.voidMethod());
assertEquals("intMethod-return 10", Foo.intMethod(10));

相关内容

  • 没有找到相关文章

最新更新