5

我有一个类像这样实现 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 方法是否被调用?

4

3 回答 3

7

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

例如 :

 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(...);   
}
于 2018-11-12T21:22:53.210 回答
3

我相信您只想测试已实现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()

    }
于 2018-11-12T21:14:24.103 回答
1

用于Mockito.spy部分模拟。

Processor processor = spy(new Processor());

doCallRealMethod().when(processor).run();

verify(processor).sendRequest(mock1, mock2);
于 2018-11-12T21:14:14.677 回答