我有一个这样的类实现Runnable
int removal = 0;
for (int numb:List_Of_Index){
list_Of_Words.remove(numb-removal);
removal++;
}
并在其他预加载类中。我用
public Processor implements Runnable{
public void run() {
while (true) {
//some code
sendRequest(object);
}
}
}
public void sendRequest(Object, object){
// do something to send the event
}
}
所以我的问题是如何对单元调用sendRequest方法进行调用?
答案 0 :(得分:3)
将关注点分开:Runnable
和相关的逻辑。
另外,它将使您的代码模式可测试。
您可以在sendRequest()
类所依赖的Foo
类中提取Processor
。
然后,您仅需在测试中模拟此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(...);
}
答案 1 :(得分:2)
我认为您只想测试已实现的run()
方法,因此可以直接使用Processor
对象调用该方法,也可以创建一个线程并将可运行对象传递给该线程并调用{{1} }
如果Thread.start()
方法正在执行任何外部操作,我建议您模拟该方法
sendRequest(Object object)
模拟以模拟here
public class ThreadTest {
@Test(//throws some exception)
public void shouldThrowSomeException() {
Processor exThread = new Processor ();
exThread.run(); //or
Thread t = new Thread(exThread);
t.start()
}
}
答案 2 :(得分:0)
使用Mockito.spy
进行部分模拟。
Processor processor = spy(new Processor());
doCallRealMethod().when(processor).run();
verify(processor).sendRequest(mock1, mock2);