JUnit终止子线程

Mar*_*ark 17 java junit multithreading unit-testing

当我测试创建子线程的方法的执行时,JUnit测试在子线程之前结束并杀死它.

我如何强制JUnit等待子线程完成其执行?

谢谢

Eya*_*der 8

在阅读了问题和一些评论之后,您需要的是一种用于单元测试异步操作的技术.doSomething()立即返回,但您希望测试代码等待其完成,然后进行一些验证.

问题是测试不知道调用产生的线程,所以显然它没有办法等待它们.人们可以想到许多复杂的(也可能是有缺陷的)方法来解决这个问题,但在我看来,这里存在一个设计问题.单元测试应该模拟某个API的客户端,它不应该假设任何有关实现的内容; 它应该只测试功能,如API及其文档所反映的那样.因此,我会避免尝试检测和跟踪异步调用创建的线程.相反,如果需要,我会改进测试类的API.异步调用所属的类应该提供一些检测终止的机制.我可以想到3种方法,但可能还有更多:

1)允许注册一旦操作完成就收到通知的监听器

2)提供操作的同步版本.该实现可以调用异步版本,然后阻塞直到完成.如果类不应该暴露这样的方法,它的可见性可以减少到包保护,以便测试可以访问它.

3)在某些可见对象上使用wait-notify模式.

如果类没有提供这样的机制,那么它不是真正可测试的,更糟糕​​的是,它可能也不是非常可重用的.