我有一个实现名为Runnable
的{{1}}的类。它被赋予第二个类,它将创建一个线程,调用此线程DoThingInALoop
。 Boss
可以告诉runnable退出并让线程终止。稍后,它可以创建具有相同Boss
的新线程。
当我为DoThingInALoop
编写单元测试时,我想模拟Boss
,因为它不是被测对象。但是,DoThingInALoop
扩展了一个类DoThingInALoop
,Loop
的代码实际上是在Loop
生成的线程中执行的。该代码当然会运行到Boss
,因为没有设置任何成员变量,因为该对象被模拟。
如何防止Java NullPointerException
通过"模拟?
Thread
答案 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