在多线程环境中使用JUnit的怪异问题

zjffdu:

在多线程环境中使用JUnit时遇到一个奇怪的问题。以下代码应该失败,但实际上会通过eclipse。

public class ExampleTest extends TestCase {

    private ExecutorService executor = Executors.newFixedThreadPool(10);

    private volatile boolean isDone = false;

    public void test() throws InterruptedException, ExecutionException {
        executor.submit(new Runnable() {

            @Override
            public void run() {
                try {
                    fail();
                } finally {
                    isDone = true;
                }
            }
        });

        while (!isDone) {
            Thread.sleep(1000);
        }
    }
}

这是另一段代码,这里我使用Future.get()等待线程停止,在这种情况下它将失败。

public class ExampleTest extends TestCase {

    private ExecutorService executor = Executors.newFixedThreadPool(10);

    private volatile boolean isDone = false;

    public void test() throws InterruptedException, ExecutionException {
        Future future=executor.submit(new Runnable() {

            @Override
            public void run() {
                try {
                    fail();
                } finally {
                    isDone = true;
                }
            }
        });

        future.get();
    }
}

我搜索了一下,发现JUnit无法处理多线程单元测试,但是这两段代码有什么区别?谢谢

Abhinav Sarkar:

JUnit无法查看在运行测试的线程以外的线程中发生的异常。在第一种情况下,通过调用fail发生异常,它发生在由运行的单独线程中executor因此,它对于JUnit不可见,并且测试通过。

在第二种情况下,相同的异常发生在由所运行的单独线程中,executor但是当您调用时,该异常实际上被“报告”回测试线程future.get这是因为future.get抛出ExecutionException,如果未来的计算有任何例外失败所致。JUnit能够看到此异常,因此测试失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在多线程环境中使用模拟对象

变量和多线程的怪异问题

在多线程环境中使用Java Singleton实例

在多线程环境中使用HttpClient的最佳实践

在多线程环境中使用Log4Net

编写测试以在多线程环境中使用Kafka Consumer

如何在多线程环境中使用序列

在多线程环境中使用Spring WebClient的正确方法

在多线程环境中使用ZMQ的正确方法?

如何在多线程环境中使用Servlet

在numba中使用多线程

需要了解在多线程环境中的AtomicInteger代码的使用问题

在多线程环境中使用std :: call_once()进行初始化

我应该在多线程环境中使用对象池,单例或静态方法吗?

如何在多线程应用程序中使用语言环境以提高性能

在多线程Rails环境中使用Redis的最佳方法是什么?(彪马/ Sidekiq)

如何在多线程HTTPClient环境中使用基本身份验证?

如何在多线程环境中使用requests-html呈现异步页面?

在多线程环境中使用专用“控制台”进行Lua会话

在多线程环境中使用libcurl会导致与DNS查找有关的非常慢的性能

在多线程环境中使用select for update nowait时,只读结果集的操作无效

多线程怪异行为

如何在junit中使用未捕获的异常处理程序进行多线程测试?

Spring中的实例变量在多线程环境中导致问题

在MFC C ++中使用多线程

在数组中使用多线程

关于在jdbc中使用多线程的教程

限制多线程中使用的资源

在Java中使用多线程读取数据