使用 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()
创建一个测试。
我创建了两个 类,它们扩展了 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()
创建一个测试。