Kev*_*vin 11 java mockito powermock
我正在尝试让PowerMock与mockito一起使用,我在这里关注文档:http://code.google.com/p/powermock/wiki/MockitoUsage13.
为了简化一下,我们假设我有一个静态方法:
StaticObj.put(String key, String val) { ... }
Run Code Online (Sandbox Code Playgroud)
要测试的类是这样的:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我想验证当它们不为空或为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");
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,这是我所期待的.什么不起作用,如果我注释掉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());
}
Run Code Online (Sandbox Code Playgroud)
例如,我想知道powermock是否看到"k1",决定"x1"从未被调用,并通过.(?)
一般来说,我有一个静态方法,称为N次(其中N根据输入参数变化).我想验证它是在正确的情况下调用的(可以通过输入参数确定).似乎powermock不能很好地处理这个问题,除非我误解了.
谢谢你的任何想法!
我仔细阅读了这个问题和问题,但不确定我是否清楚地理解了它们 - 从我的理解来看,当你传递k和x但只验证k时,powermock引发异常是正确的.
因为您正在模拟静态方法StaticObj.put,所以当您传递参数k和x并使用它进行验证时
PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");
PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
Run Code Online (Sandbox Code Playgroud)
这应该工作.当您验证参数k和x并验证k被注释掉时.
// PowerMockito.verifyStatic(times(1));
// StaticObj.put("k1", "k1");
PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
Run Code Online (Sandbox Code Playgroud)
Powermock首先会使用put("k1"...)进行调用,因此x的验证会引发错误.您的验证过程已按顺序排列.
| 归档时间: |
|
| 查看次数: |
21880 次 |
| 最近记录: |