【问题标题】:Unit Testing Daemon Thread's code in Java using JUnit使用 JUnit 在 Java 中单元测试守护线程的代码
【发布时间】:2015-02-12 08:37:16
【问题描述】:

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

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
        }
    }
 }

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

【问题讨论】:

  • B 类不创建 线程。 B类一个Thread实例,如果其他线程调用new B().start(),它的run()方法将在in线程中运行。

标签: java multithreading unit-testing junit mocking


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多