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

时间:2018-11-12 21:05:17

标签: java multithreading unit-testing junit

我有一个这样的类实现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方法进行调用?

3 个答案:

答案 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);