使用 JUnit 在 Java 中对守护进程线程的代码进行单元测试

Unit Testing Daemon Thread's code in Java using JUnit

我创建了两个 类,它们扩展了 Thread 并实现了 运行 方法。

class A extends Thread implements MyInterface {

    public void run() {
    }

    public function() {
        B b= new b();
        b.start();
    }
}

class B extends Thread implements OtherInterafce {

    MyClassC  object = new MyClassC();

    public void run() {
        for(;;) {
            object.callMethod();
            object.callMethod2();
            //Perform some operations
        }
    }
 }

现在我想为这些 类 编写单元测试,因为 Class B 正在创建一个守护线程,没有退出条件,我不确定如何测试这部分。我可以创建一个 object 的模拟,但我不确定会 运行 多少次,所以我应该如何调用这些方法。

您需要一些方法来终止线程。有很多方法可以做到这一点,所以我建议你研究这个话题。一个例子是易失性标志,每次线程循环时都会检查它。

一旦可以终止线程,就可以对其进行测试。关于如何执行此操作有几个选项。最简单的可能是创建一个始终执行一次的线程,然后检查取消标志。 IE。结构如:

public void run() {
    do {
        object.callMethod();
        object.callMethod2();
        //Perform some operations
    } while (conditionIsTrue);
}

在您的测试中,您可以构建线程对象并立即将标志设置为 false。然后你的线程将 运行 只循环一次,允许你准确地验证与你的模拟对象的交互。

单元测试多线程非常困难。最好只测试逻辑而不是线程。您可以提取内部部分并单独测试它:

public void run() {
    for(;;) {
        performOperations(object);
    }
}

public performOperations(MyClassC object) {
    object.callMethod();
    object.callMethod2();
    //Perform some operations
}

然后您可以为 performOperations() 创建一个测试。