12

我正在尝试让 PowerMock 与 mockito 一起使用,并且我正在关注此处的文档:http ://code.google.com/p/powermock/wiki/MockitoUsage13 。

为了简化一点,假设我有一个静态方法:

StaticObj.put(String key, String val) { ... }

而要测试的类是这样的:

public class ClassToTest {
    public void doSomething(Params p) {
        if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK());
        if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX());
    }
}

在我的单元测试中,我想验证 StaticObj.put 在 K 和 X 不为空白或 null 时是否被调用,所以我执行以下操作:

public void testNormalCase() {
    // assume that mocking setup for statics already happened in some @Before function..
    Params params = new Params("k", "x");
    ClassToTest classToTest = new ClassToTest();
    classToTest.doSomething(params);

    // now I want to verify:
    PowerMockito.verifyStatic(times(1));
    StaticObj.put("k1", "k1");

    PowerMockito.verifyStatic(times(1));
    StaticObj.put("x1", "x");
}

这行得通,这是我所期望的。什么不起作用,如果我注释掉 K 的验证,那么 X 的验证就会失败!错误消息表明 ("x1", "x") 是预期的,但得到了 ("k1", "k")。为什么是这样?我没有正确编码吗?

这也让我相信,通过的以下类型的测试可能完全因为错误的原因而通过:

public void testOtherCase() {
    // assume that mocking setup for statics already happened in some @Before function..
    Params params = new Params("k", null);
    ClassToTest classToTest = new ClassToTest();
    classToTest.doSomething();

    // now I want to verify:

    PowerMockito.verifyStatic(never());
    StaticObj.put(eq("x1"), anyString());
}

例如,我想知道 powermock 是否看到“k1”,决定从未调用过“x1”,然后通过。(?)

一般来说,我有一个称为 N 次的静态方法(其中 N 根据输入参数而变化)。我想验证它是否在正确的情况下被调用(可以由输入参数确定)。似乎 powermock 不能很好地处理这个问题,除非我误解了。

感谢您的任何想法!

4

2 回答 2

6

我仔细阅读了这个问题和问题,但不确定我是否清楚地理解了它们 - 根据我的理解,当你通过 k 和 x 但只验证 k 时,powermock 引发异常是正确的。

因为您正在模拟静态方法 StaticObj.put,所以当您传递参数 k 和 x 并使用

PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");

PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x"); 

这应该有效。并且当您验证参数 k 和 x 并验证 k 时被注释掉。

// PowerMockito.verifyStatic(times(1));
// StaticObj.put("k1", "k1");

PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");

Powermock 显然会首先使用 put("k1"...) 进行调用,因此 x 的验证将引发错误。您的验证过程是有序的。

于 2012-07-19T02:27:16.257 回答
1

我不知道从哪个版本开始,但PowerMockito.verifyStatic(VerificationMode)已弃用。只是想向其他人指出这一点,在上一篇文章之后的几年里发现了这一点。

于 2020-10-21T16:48:24.547 回答