3

我正在为 Junits 使用 mockito

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

谢谢

4

4 回答 4

5

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

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

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

我个人在练习 TDD 时使用“疼痛指标”来查看我的设计是否可以。当然,一切都取决于上下文,但通常这是一个良好设计的良好指标(至少对我和其他一些人来说)。

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

干杯

于 2012-08-27T10:18:14.327 回答
1

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

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

于 2012-08-27T10:15:24.093 回答
1

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

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

于 2012-08-27T10:12:42.263 回答
0

Mockito 从 3.4.0 版本开始支持模拟静态方法。通过限制静态方法模拟的范围,它比 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));
于 2020-09-07T14:34:59.753 回答