我正在尝试让 PowerMock 与mockito一起使用,并且我正在关注此处的文档:http://code.google.com/p/powermock/wiki/MockitoUsage13 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());
}
}
在我的单元测试中,我想验证当 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());
}
例如。我想知道 powermock 是否看到“k1”,决定“x1”从未被调用,然后通过。 (?)
一般来说,我有一个被调用 N 次的静态方法(其中 N 根据输入参数而变化)。我想验证它是否在正确的情况下被调用(可以通过输入参数确定)。看来 powermock 不能很好地处理这个问题,除非我误解了。
感谢您的任何想法!