2012-10-12 32 views
1

我有一个工作进程在数据队列上工作。 A 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();对main函数的调用永远不会返回(因为worker是假设连续运行的)。在这种情况下,我不应该为它写单元测试吗?如果是的话,我该如何写一些其他形式的测试来确保工作人员按照要求工作?

+0

你需要调用'workerThread.join()'吗?它的用途是什么?如果一个线程开始另一个线程并立即加入它,它可能已经完成了工作本身。 –

+0

如果我不执行'thread.join()',工作进程就会死亡。我不希望工作进程需要永久生存。 – samach

+0

它是一个解决方案,启动一个孤立的设置工人,与嘲笑队列?处理完这个模拟队列后,你可以停止工作。 – MemLeak

回答

0

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

显然,你需要的方式来终止工作,为版本,它可能看起来像

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

,所以你需要将你的的WorkerThread本地值转换为一个领域,并使其挥发性