如何用Junit测试实现Runnable的类



我有一个类实现了像这个一样的Runnable

public Processor implements Runnable{
public void run() {
while (true) {
//some code
sendRequest(object);
}
}
}
public void sendRequest(Object, object){
// do something to send the event
}
}

以及在其他预加载类中。我使用

Processor processor = new Processor();
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(processor)

所以我的问题是如何对sendRequest方法进行单元测试?

分离关注点:Runnable和关联的逻辑
它还将使您的代码模式可测试
您可以在Processor类所依赖的Foo类中提取sendRequest()。然后,您只需要在测试中模拟这个Foo类,并验证是否调用了sendRequest()方法。

例如:

public Processor implements Runnable{
private Foo foo;
public Processor(Foo foo){
this.foo = foo;
}
public void run() {
while (true) {
//some code
foo.sendRequest(object);
}
}
}

测试:

@Mock
Foo fooMock;
@Test
public void run() {
Processor processor = new Processor(fooMock);
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(processor);
executor.awaitTermination(someTime, TimeUnit.SECONDS);
Mockito.verify(fooMock).sendRequest(...);   
}

我相信您只想测试实现的run()方法,所以您可以直接使用Processor对象调用该方法,也可以创建一个线程并将可运行对象传递给它并调用Thread.start()

如果sendRequest(Object object)方法正在进行任何外部操作,我建议您模拟该方法

public class ThreadTest {
@Test(//throws some exception)
public void shouldThrowSomeException() {
Processor exThread = new Processor ();
exThread.run(); //or
Thread t = new Thread(exThread);
t.start()
}
}

嘲笑在此处嘲笑

@Test(//throws some exception)
public void shouldThrowSomeException() {
Processor exThreadmock = mock(Processor.class);
when(exThreadmock.sendRequest(anyObject))
.thenThrow(SomeException.class)
Thread t = new Thread(exThread);
t.start()
}

使用Mockito.spy进行部分嘲讽。

Processor processor = spy(new Processor());
doCallRealMethod().when(processor).run();
verify(processor).sendRequest(mock1, mock2);

最新更新