如何测试使用Junit实现Runnable的类

Hen*_*Lee 5 java junit multithreading unit-testing

我有一个这样的类实现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
  }
}
Run Code Online (Sandbox Code Playgroud)

并在其他预紧课上。我用

Processor processor = new Processor();
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(processor)
Run Code Online (Sandbox Code Playgroud)

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

dav*_*xxx 5

将关注点分开: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);
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

和测试:

@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 Code Online (Sandbox Code Playgroud)