模拟静态方法

3
我想模拟调用其他静态方法中的静态方法。
public class MyClass
{
    public static void methodA(String s)
    {
        ...
        methodB(s);
        ...
    }
    public static void methodB(String s)
    {
        ...
    }
}

所以,我想模拟methodA,但是我想跳过调用methodB。我尝试了几乎所有我能找到的解决方案,但都没有成功。每次都会调用methodB

我使用的一些解决方案:

PowerMockito.suppress(method(MyClass.class, "methodB"));
MyClass.methodA("s");

_

PowerMockito.stub(method(MyClass.class, "methodB"));
MyClass.methodA("s");

_

PowerMockito.mockStatic(MyClass.class);
doNothing().when(MyClass.class, "methodB", anyString());
MyClass.methodA("s");

还有很多其他问题... 有人有解决这个问题的想法吗?


你想做那件事情有具体的原因吗?如果你想测试你的 methodA 并且它调用了其他方法,也许你应该以这种方式进行测试并测试你的 methodB - Stefan Lindner
methodB 只能与特定设备配合使用,因此我无法模拟该部分,所以我想跳过它。 - Milorad
好的,这很有道理,但是为什么不直接模拟该方法,而不是不调用methodB呢? - Stefan Lindner
被接受的答案的好处是:间谍与纯粹的Mockito一起工作。让你远离PowerMock(ito)的列车,这通常是一件好事。 - GhostCat
1个回答

5

我认为你应该监视你的类而不是嘲笑它。

在这种情况下,所有静态方法都将调用真实的实现,并且你还可以指示不调用 methodB

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
class MyClassTest
{
    @Test
    public void test()
    {
       PowerMockito.spy(MyClass.class);
       doNothing().when(MyClass.class, "methodB", anyString());
       MyClass.methodA("s");
    }
}

如果您需要更深入地了解,我已经写了一篇关于使用PowerMock模拟静态方法的文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接