【问题标题】:Spy private method on thread with mockito使用 mockito 监视线程上的私有方法
【发布时间】: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


【解决方案1】:

@PrepareForTest 注解应该引用包含要测试的私有方法的类,这里是MyRunnable。查看https://code.google.com/p/powermock/wiki/MockitoUsage13 的最后一个示例。

【讨论】:

  • 是的,当然,我做到了,只是我在这里复制/粘贴失败。 MyRunnable 是在 @PrepareForTest 注释上引用的。我编辑我的帖子以更正此问题。
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多