2011-03-12 224 views
11

我试图让PowerMock与mockito一起工作,并且我正在按照这里的文档:http://code.google.com/p/powermock/wiki/MockitoUsage13PowerMock,mockito,验证静态方法

为了简化一点,可以说,我有一个静态方法:

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,如果它们不是空白或空值,我会这样做:

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似乎不能很好地处理这个问题。

感谢您的任何想法!

+2

我已经在一个我认为可能有关的问题上开了一个问题。 http://code.google.com/p/powermock/issues/detail?id=342 – 2011-08-18 15:58:57

回答

6

我仔细阅读了这个问题和问题,但不确定是否我清楚地理解了这些问题 - 从我的理解中,PowerMock在通过k和x但仅验证k时引发异常是正确的。

因为你嘲讽静态方法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会产生错误。您的验证过程是按顺序排列的。