线程的jUnit测试用例

时间:2018-12-14 06:24:07

标签: java multithreading unit-testing junit threadpool

我知道测试线程始终是一个挑战。除了测试Thread外,我还有一个问题。有没有一种方法可以测试线程,并可以使用jUnit找出哪些数据经过了哪个线程。 假设有n个线程将数据存储到表中。我们能否确定哪个线程存储了哪一行数据。

已更新

public void storePrescription(List<Prescription> payload) {
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    for (Prescription presciption : payload) {
        Runnable runnable = new PrescriptionThread(presciption, prescriptionService);
        executorService.execute(runnable);
    }
    executorService.shutdown();

    while(!executorService.isTerminated()) {}
}

线程类

public class PrescriptionThread implements Runnable{

private PrescriptionService presServ;

private  Prescription pres ;

public PrescriptionThread(Prescription pres, PrescriptionService prescriptionService) {
    this.pres = pres;
    this.presServ = prescriptionService;
}

@Override
public void run() {
    presServ.savePrescription(pres);
}
}

2 个答案:

答案 0 :(得分:0)

最棘手的方法是记录当前线程名称或ID及其正在处理的数据。

Logger logger = Logger.getLogger(TestLogThreadName.class);
String currentThreadName = Thread.currentThread().getName();
logger.trace("processing data (" + data + ") with Thread " + currentThreadName);

尽管这将是最容易实现的,但它仍然取决于数据大小,因为生成的日志文件可能非常庞大且难以读取。

您要监视哪个方面,如果它是与cpu或内存相关的硬件资源,也许您可​​以尝试使用OS提供的某些工具。

已更新:

首先创建一个用于编写日志的util类,

import org.apache.log4j.Logger;
public class LogThreadNameUtil{

    static Logger logger = Logger.getLogger(LogThreadNameUtil.class);

    public static void log(String threadName
        , Prescription prescription){
        //you have to get specific 
        //field value from prescription or override toString()
        logger.trace("processing data (" + prescription 
            + ") with Thread " + currentThreadName);
    }
}

然后从您的跑步者那里调用日志实用程序,

public class PrescriptionThread implements Runnable{

private PrescriptionService presServ;

private  Prescription pres ;

public PrescriptionThread(Prescription pres, PrescriptionService prescriptionService) {
    this.pres = pres;
    this.presServ = prescriptionService;
}

@Override
public void run() {
        presServ.savePrescription(pres);
        LogThreadNameUtil.log(Thread.currentThread().getName(), pres);
    }
}

答案 1 :(得分:0)

您可以使用对您有意义的任何方式来命名您的工作人员,并按如下所示登录run方法:

public class PrescriptionThread implements Runnable{

    private PrescriptionService presServ;
    private  Prescription pres ;
    private  String name ;

    public PrescriptionThread(Prescription pres, PrescriptionService prescriptionService, String name) {
        this.pres = pres;
        this.presServ = prescriptionService;
        this.name = name;
    }

    @Override
    public void run() {
        presServ.savePrescription(pres);
        LOG.info("Worker-" + name + " saved: " + pres);
    }
}
相关问题