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,但我希望找到比这个更好的东西,或者可能正在寻找其他解决方案这可能。
我认为你确实需要将问题分成更小的部分,然后将这些解决方案组合在一起以获得最终解决方案:
- 您有一个无法更改的无限循环程序,但您需要对其进行测试
- 让执行返回测试的唯一方法是在单独的线程中执行逻辑
- 你需要kill/stop之后的线程
- 在 Java 中你通常不能轻易做到这一点,你可以考虑使用
ExecutorThread
并取消 Future
s,甚至守护线程
- 你需要像行为一样超时
- 最简单的方法是使用 JUnit 或 TestNG 内置功能
最终的解决方案将是所有部分解决方案的组合。
我正在编写单元测试,但我被一个具有 无限循环 .
的方法困住了我有一个主要的 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,但我希望找到比这个更好的东西,或者可能正在寻找其他解决方案这可能。
我认为你确实需要将问题分成更小的部分,然后将这些解决方案组合在一起以获得最终解决方案:
- 您有一个无法更改的无限循环程序,但您需要对其进行测试
- 让执行返回测试的唯一方法是在单独的线程中执行逻辑
- 你需要kill/stop之后的线程
- 在 Java 中你通常不能轻易做到这一点,你可以考虑使用
ExecutorThread
并取消Future
s,甚至守护线程
- 在 Java 中你通常不能轻易做到这一点,你可以考虑使用
- 你需要像行为一样超时
- 最简单的方法是使用 JUnit 或 TestNG 内置功能
最终的解决方案将是所有部分解决方案的组合。