PowerMock,mockito,validation静态方法

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

在我的unit testing中,我想validation当它们不为空或为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的validation,那么X的validation失败了! 错误消息表明(“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根据输入参数变化)。 我想validation它是在正确的情况下调用的(可以通过输入参数确定)。 似乎powermock不能很好地处理这个问题,除非我误解了。

谢谢你的任何想法!

我仔细阅读了这个问题和问题,但不确定我是否清楚地理解了它们 – 根据我的理解,当你传递k和x但只validationk时,powermock会引发exception是正确的。

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

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

这应该工作。 当您validation参数k和x并validationk被注释掉。

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

Powermock首先会使用put(“k1”…)进行调用,因此x的validation会引发错误。 您的validation过程已按顺序排列。