为 runnable class 创建 junit 测试

create junit test for runnable class

我有一个可运行的 class 如下所示,

public class WriteToOutputFile implements Runnable{
  BlockingQueue<entry> queue;
  File file;
  volatile boolean processentries;

  WriteToOutputFile(BlockingQueue queue,File file){
    this.queue = queue;
    this.file = file;
    this.processentries= tue;
  }

  @Override 
  public void run(){
    while(processentries && !queue.isEmpty())
      entry = queue.take();

    if (entry== lastentry)break;
      //logic to write entries to file 
  }

  public void stop(){
    processentries = false;
    queue.put(lastentry);
  }
}

我想为这个 runnable 创建 Junit 测试用例。 由于我是编写 Junit 测试用例的新手,请告诉我最好的方法是什么。 我创建了如下所示的 Junit 测试,

testWriteToOutputFile{ 
  @Test  
  functionalitytest(){
    BlockingQueue queue = new BlockingQueue(); 
    File file; 
    WriteToOutputFile workerthread = Powermockito.spy(
      new WriteToOutputFile(queue,file));  
    Thread workerthread = new Thread(workerthread );  
    workerthread.start();  
    queue.put(entry);
    workerthread.stop();  
    assertEquals(0,queue.size());
  }
}

请帮助我,让我知道这种方法是否正确

要在单独的线程中测试 运行nable 运行ning,JUnit 测试应该 (1) 构造 运行nable,(2) 启动一个构造在 运行nable 上的线程运行启用,(3) 对一些条目进行排队,(4) 等待一小段时间,(5) 调用 stop(),以及 (6) 检查是否所有条目都已处理。

在这种情况下,您的代码将无法通过测试,因为您的 运行() 方法没有循环,因此只会处理第一个条目。它也没有任何用于处理条目的代码,还没有编译。

除了JUnit测试之外,您还需要对并发问题进行仔细的代码检查。例如,processEntries 需要是可变的。