JUnit 终止子线程
2022-09-02 22:24:16
当我测试创建子线程的方法的执行时,JUnit 测试在子线程之前结束并杀死它。
如何强制 JUnit 等待子线程完成其执行?
当我测试创建子线程的方法的执行时,JUnit 测试在子线程之前结束并杀死它。
如何强制 JUnit 等待子线程完成其执行?
在阅读了问题和一些注释之后,似乎您需要的是一种用于单元测试异步操作的技术。doSomething() 会立即返回,但您希望测试代码等待其完成,然后执行一些验证。
问题在于测试不知道调用生成的线程,因此显然它没有办法等待它们。人们可以想到许多复杂(并且可能有缺陷)的方法来解决这个问题,但在我看来,这里有一个设计问题。单元测试应该模拟某个API的客户端,并且它不应该假设任何关于实现的东西;它应该只测试功能,如 API 及其文档所反映的那样。因此,我将避免尝试检测和跟踪由异步调用创建的线程。相反,如果需要,我会改进测试类的API。异步调用所属的类应提供某种检测终止的机制。我可以想到3种方法,但可能还有更多:
允许注册在操作完成后收到通知的侦听器
提供操作的同步版本。实现可以调用异步版本,然后阻止直到完成。如果类不应公开此类方法,则可以将其可见性降低为受包保护,以便测试可以访问它。
在某些可见对象上使用等待通知模式。
如果该类不提供这样的机制,那么它就不是真正可测试的,更糟糕的是,它可能也不是非常可重用的。
尝试在创建的线程上使用 thread.join()。这将等待该线程死亡。
编辑:为了避免这种情况,请尝试在测试中,或者在方法中尝试。我还没有测试过这个。Thread.getThreadGroup().setDaemon(true);
setUp()
守护程序线程组在停止其最后一个线程或销毁其最后一个线程组时自动销毁。
但是,我想知道JUnit是否在测试完成后立即打电话或其他东西。System.exit()