【问题标题】:Unit testing blocking processes单元测试阻塞进程
【发布时间】:2012-10-12 14:34:52
【问题描述】:

我有一个工作进程处理数据队列。 training worker 读取并处理来自 training queue 的数据。它继续轮询并寻找写入队列的新数据。

我已经按如下方式实现了工人:

public static void main(String[] args) {
  startTraining()
}

public static boolean startTraining() {
  trainingWorker = new WorkerImpl(config);
  final Thread workerThread = new Thread(trainingWorker);

  WorkerListener listener = new WorkerListener() {
    public void onEvent(WorkerEvent event, Worker worker, String queue, Job job, 
                        Object runner, Object result, Exception ex) {
      if(event.equals(WorkerEvnet.JOB_SUCCESS) {
        //get data
        //process data
        //send data
      }
    }
  }

  trainingWorker.addListener(listener, WorkerEvent.JOB_SUCCESS, WorkerEvent.JOB_FAILURE,
                     WorkerEvent.WORKER_ERROR, WorkerEvent.WORKER_POLL);
  workerThread.start();
  workerThread.join();
}

我希望进行单元测试以查看工作人员是否正确读取数据、正确处理数据并成功发送数据。问题是因为Thread.join();对主函数的调用永远不会返回(因为假设工作人员连续运行)。在这种情况下,我不应该为它编写单元测试吗?如果是,我该如何编写其他形式的测试来确保工人按要求工作?

【问题讨论】:

  • 您需要拨打workerThread.join()吗?它的用途是什么?如果一个线程启动另一个线程并立即加入它,它还不如自己完成工作。
  • 如果我不做thread.join(),工作进程就会死掉……我不希望这样,因为工作进程需要永远存在。
  • 在隔离设置中使用模拟队列启动工作人员是否是一种解决方案?处理完这个模拟队列后,您可以停止工作人员。
  • 如果工作线程是普通线程,那么只要该线程在运行,工作进程就不会死亡。只有当该线程是守护进程时,该进程才会终止。

标签: java multithreading unit-testing


【解决方案1】:

您可能希望从代码中删除连接,或者从测试用例中启动新线程,这将为您启动工作程序。

显然,您将需要终止工作人员的方法,因为它可能看起来像这样的版本

public void stopWorker() {
 workerThread.interrupt()
}

因此您需要将 workerThread 本地值转换为字段,并使其 volatile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多