如何用mockito模拟静态方法?

时间:2012-08-27 09:59:54

标签: java junit mockito

我正在使用模拟游戏来获取Junits

我知道mockito donot模拟静态方法,但有没有办法解决这个问题,而不是使用powermock?

由于

4 个答案:

答案 0 :(得分:5)

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

虽然这意味着你必须修改你的生产代码。

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

我在练习TDD时亲自使用“疼痛指标”来判断我的设计是否合适。当然,一切都取决于背景,但通常这是良好设计的良好指标(至少对我和其他一些人而言)。

所以我的建议摆脱了这些静态方法或修改你的设计而不依赖于静态方法模拟。

干杯

答案 1 :(得分:1)

不确定您正在寻找什么“方式”。很多人一起使用Mockito和Powermock,我没有听到任何关于不兼容或冲突的恐怖故事。只需在你需要模拟静态方法的那些实例中使用Powermock就可以了。

或重构不要以需要模拟的方式使用静态方法。

答案 2 :(得分:1)

不,我认为如果没有PowerMock,没有办法做到这一点。

但是你可以通过引入adapter来打破对这种静态方法的依赖。

答案 3 :(得分:0)

从3.4.0版开始,Mockito支持模拟静态方法。 通过限制静态方法模拟的范围,它比PowerMock做得更好。

要使用此功能,必须通过将以下文件添加到test-classpath中来启用 Mockito的内联模拟程序

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

文件内容必须为以下一行:

mock-maker-inline

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

下面是如何模拟有参数和无参数的静态方法的示例

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