我有一个类实现了像这个一样的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);