首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JUnit测试用例中等待被测代码产生的所有线程

在JUnit测试用例中等待被测代码产生的所有线程
EN

Stack Overflow用户
提问于 2010-08-18 22:24:58
回答 3查看 4.2K关注 0票数 1

在JUnit测试用例中,如何确保被测方法直接/间接产生的所有线程都完成了这些工作,以便我可以断言最终结果?

代码语言:javascript
运行
复制
@Test
public void testMethod() {
 Result result=method();// may spawn multiple threads to set result.value

 Assert.assertTrue(result.getValue()==4); //should execute only after result.value is set to its final value.
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-18 22:46:41

真正的问题是,在非测试代码中如何处理这种情况?何时设置result.valuemethod()的接口向调用者保证了什么?

在编写测试时请牢记这一点-其目的是断言类及其方法的行为与它们所宣传的一样。有时,找出所宣传的接口可能是挑战的一半。

在这种情况下,我强烈建议您的Result对象的行为类似于Future,因为它的get()方法会阻塞,直到结果可用。(或者,给它一个waitFor()方法或类似的方法)。

如果您的方法没有提供任何特定的保证或阻塞调用,那么您在测试中真正能做的就是在循环中每隔x秒检查一次该值,并在测试中放置一个@Timeout以确保在“合理”时间内设置该值。但这也是客户端所能做的全部,所以

  1. 这是一个非常有效的测试;
  2. 它强调了界面对客户端来说不是很有用,修改它会是一个很好的想法。
票数 3
EN

Stack Overflow用户

发布于 2010-08-18 23:50:19

我建议您在Thread#join ()中调用多个线程实例的方法,按照这种方式,所有子线程都完成了。

票数 1
EN

Stack Overflow用户

发布于 2010-10-26 01:07:39

处理此问题的一种方法需要两个步骤:

  • 在等待工作线程时阻塞主测试线程
  • 让每个工作线程在其工作完成时向主线程发出信号,在最后一个工作线程完成时解除对主线程的阻塞。

理想情况下,如果所有工作线程都没有在预期的时间范围内完成,您会希望主线程超时并导致测试失败。使用ConcurrentUnit实现这一点非常简单。

代码语言:javascript
运行
复制
public class MyTest extends ConcurrentTestCase {
    @Test
    public void test() throws Throwable {
        int threads = 5;
        for (int i = 0; i < threads; i++) {
            new Thread(new Runnable() {
                public void run() {
                    threadAssertEquals(1, 1); // Perform assertions as needed
                    resume();
                }
            }).start();
        }

        threadWait(1000, threads); // Wait for 5 resume calls
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3513104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档