PowerMock,mockito,验证静态方法

时间:2011-03-12 21:49:40

标签: java mockito powermock

我正在尝试让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());
    }
}

在我的单元测试中,我想验证当它们不为空或为null时,为K和X调用StaticObj.put,所以我做了类似这样的事情:

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

E.g。我想知道powermock是否看到“k1”,决定从未调用过“x1”并且通过。 (?)

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

感谢您的任何想法!

2 个答案:

答案 0 :(得分: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的验证会引发错误。您的验证过程已按顺序排列。

答案 1 :(得分:1)

我不知道哪个版本,但是不推荐使用PowerMockito.verifyStatic(VerificationMode)。只是想指出这一点,以便在上一篇文章发表后的今年找到其他人。

相关问题