jUnit - 为具有无限循环的主包 class 方法设置计时器

jUnit - Set timer for a main package class method having an infinite loop

我正在编写单元测试,但我被一个具有 无限循环 .

的方法困住了

我有一个主要的 class,它使用 main 方法执行,因此我必须使用 junit.framework.Test,它没有 @Test(timeout=1000) 等注释,而是它通过创建其构造函数来调用主要 class。

现在的问题是:我已经编写了所有的测试用例,它可能也能正常工作,但看到了输出,但测试陷入了无限循环。

来自我的主要测试 class,它使用 junit.framework.Test 而不是 org.junit.Test。我调用了另一个 class 的 public 方法,它有类似

的东西
public class AnotherClass{
 public void method()
    {
       for( ; ;)  // this is an infinite loop
        {
          .....
         }
    }
}

这是因为它实际上是在持续监控一个目录,程序必须保持运行直到手动终止。

我的主要测试 class 调用这个 class 的方法,它再也不会 returns 控制我的测试 class。因为,我正在编写测试,所以我无法修改该方法。

如何终止或收回对 class 的控制(回到我的测试 class)?

我尝试在我的测试 class 中使用 timer/thread 以在特定时间后停止执行,但这不起作用,因为控制权转到另一个 class 其 public 方法被调用并永远卡在那里。

关于如何做到这一点有什么想法吗?

如果您需要这方面的更多信息,请告诉我。谢谢

注意:死循环的class不是测试class,它是包中的主要class,所以我不能在那里做任何修改。

我有一个解决方案,它有点基于这个logic,但我希望找到比这个更好的东西,或者可能正在寻找其他解决方案这可能。

我认为你确实需要将问题分成更小的部分,然后将这些解决方案组合在一起以获得最终解决方案:

  1. 您有一个无法更改的无限循环程序,但您需要对其进行测试
    • 让执行返回测试的唯一方法是在单独的线程中执行逻辑
  2. 你需要kill/stop之后的线程
    • 在 Java 中你通常不能轻易做到这一点,你可以考虑使用 ExecutorThread 并取消 Futures,甚至守护线程
  3. 你需要像行为一样超时
    • 最简单的方法是使用 JUnit 或 TestNG 内置功能

最终的解决方案将是所有部分解决方案的组合。