【发布时间】:2013-08-29 01:07:17
【问题描述】:
我有一个 runnable,在他的一生中调用了一个 void 私有方法。 我想使用 PowerMockito 测试我的方法“processStep”是否真的只为每个参数调用一次。
MyRunnable 类
public class MyRunnable extends Runnable {
MyRunnable(args){
...
}
@Override
public final void run{
...
processStep();
...
}
private void processTep(a){
...
addAttributeResult();
...
}
private void addAttributeResult(){
...
}
}
我的测试类用于测试 MyRunnable 类
@PowerMockIgnore("org.apache.log4j.*")
@RunWith(PowerMockRunner.class)
@PrepareForTest({ DBReader.class, MyRunnable.class })
public class CycleManagerTest {
@Test
public void myTest(){
MyRunnable myRunnable = new MyRunnable(arg[] {a,b});
Thread t = new Thread(myRunnable);
t.start();
while (myRunnable.getNbrEndCycle() < 1) {
Thread.sleep(10);
}
t.interrupt();
for(String s : arg){
PowerMockito.verifyPrivate(myRunnable, times(1)).invoke("processStep", a);
}
}
}
当只有一个参数时测试成功,但当参数很多时,测试错误如下:
*org.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
-> at fr.MyRunnable.addAttributeResult(MyRunnable.java:254)
Example of correct verification:
verify(mock).doSomething()
Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.*
我真的不明白发生了什么。我想我在某个地方完全错了。
【问题讨论】:
-
如果
processStep被调用两次会有什么明显的影响?或者,如果它根本没有被调用。如果没有,那你为什么要关心测试呢?如果存在 可观察到的效果,那么您当然可以测试那些。调用processStep的确切次数是一个实现细节,不应成为单元测试的一部分。 -
对某些论点有一些可观察到的影响,但不是全部。我想测试给定的每个参数是否真的调用了
processStep()方法,这就是我在这里要做的。顺便说一句,我不确定这是单元测试的一部分。也许只是看到MyRunnable的结果应该是我的单元测试(如果我理解你的话)? -
我想说的是你应该测试行为,而不是实现。如果实现细节对行为没有影响,那么测试它的净收益实际上是负面的。
-
好的,我明白你在告诉我什么。我必须专注于行为而不是实施。我会尽量记住它。
标签: java multithreading mockito powermock