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

时间:2015-01-24 04:36:00

标签: java unit-testing junit infinite-loop

我正在编写单元测试,并且我坚持使用无限循环的方法。

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

现在的问题是:我已经编写了所有测试用例,并且看起来很可能正常工作,但是测试仍处于无限循环中。

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

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

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

我的主要测试类调用这个类的方法,它再也不会将控制权返回给我的测试类。因为,我正在编写测试,我无法修改该方法。

如何终止或取消该课程的控制权(返回我的考试类)?

我尝试在我的测试类中使用timer / thread来阻止它在一定时间后执行,但这不起作用,因为控件转到另一个调用了公共方法的类并且它永远停留在那里。

关于如何做到这一点的任何想法?

如果您需要更多信息,请告知我们。感谢

注意:具有无限循环的类不是测试类,它是包中的主类,所以我不能在那里进行任何修改。

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

1 个答案:

答案 0 :(得分:0)

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

  1. 你有一个程序,它有无限循环,你无法改变,但你需要测试它
    • 将执行恢复到测试的唯一方法是在单独的线程中执行逻辑
  2. 之后你需要杀死/停止线程
    • 在Java中你通常不能轻易做到这一点,你可以考虑使用ExecutorThread并取消Future s,甚至是守护程序线程
  3. 你需要像行为一样超时
    • 最简单的方法是使用JUnit或TestNG内置功能
  4. 最终解决方案将是所有部分解决方案的组合。