使用Mockito模拟Runnable创建一个线程

时间:2015-09-29 02:29:18

标签: java multithreading unit-testing mockito

我有一个实现名为Runnable的{​​{1}}的类。它被赋予第二个类,它将创建一个线程,调用此线程DoThingInALoopBoss可以告诉runnable退出并让线程终止。稍后,它可以创建具有相同Boss的新线程。

当我为DoThingInALoop编写单元测试时,我想模拟Boss,因为它不是被测对象。但是,DoThingInALoop扩展了一个类DoThingInALoopLoop的代码实际上是在Loop生成的线程中执行的。该代码当然会运行到Boss,因为没有设置任何成员变量,因为该对象被模拟。

如何防止Java NullPointerException通过"模拟?

Thread

1 个答案:

答案 0 :(得分:2)

我认为这对Mockito来说太过分了。

我会将Thread执行封装在一个你可以轻松模拟的新类中(让我们称之为Executor)。

public class Executor {
    public void execute(Runnable runnable) {
        new Thread(runnable).start();
    }
}

然后在创建Executor时使用Thread

public class Boss {
    private final DoThingInALoop toBeMocked;
    private final Executor executor;

    public Boss(final Executor executor, final DoThingInALoop toBeMocked) {
        this.executor = executor;
        this.toBeMocked = toBeMocked;
    }

    public void start() {
        executor.execute(toBeMocked);
    }
}

在测试中,您只需要模拟Executor

    DoThingInALoop mockLoop = Mockito.mock(DoThingInALoop.class);
    Executor mockExecutor = Mockito.mock(Executor.class);
    Boss boss = new Boss(mockExecutor, mockLoop);

    boss.start();

    // No NPE aynymore
    verify(mockExecutor).execute(mockLoop);

另一种选择是尝试PowerMock