java - JUnit for future.get() 异常场景

标签 java multithreading junit4

我需要测试 InterruptedExceptionExecutionException 并为其编写 JUnit。

请就此向我提出建议。我如何中断线程来复制场景。 populateDataForm 将启动新线程并将其添加到 futures 列表中。

这是我的示例代码:

class MyTest{
    public populateData(){

    Collection<Future<?>> futures = new LinkedList<Future<?>>();
    DataSet ds = Helper.populateDataForm(employee, futures);

    waitForTaskCompletion(futures);
    }


    private waitForTaskCompletion(futures){
    for (Future<?> future:futures) {
        try {
               future.get();
            } catch (InterruptedException e) {
               throw new CustomExcpetion("Message1", e)
            } catch (ExecutionException e) {
               throw new CustomExcpetion("Message2", e)
        }

    }
}

最佳答案

您可以继承MyTest并重载populateData()方法,如下所示:

public void populateData() {

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    Callable<String> calls = new Callable<String>() {

        @Override
        public String call() throws Exception {
            for (;;){
                Thread.sleep(100);
                // You call interrupt here, which causes Future.get() interrupt
                Thread.currentThread().interrupt();
                if (1 > 2) break;
            }
            return null;
        }
    };
    final Future<String> future = executorService.submit(calls);

    waitForTaskCompletion(future);
    executorService.shutdown();
}

要测试 ExecutionException 抛出 RuntimeException 而不是中断,如下所示:

if (1==1)throw new RuntimeException();

关于java - JUnit for future.get() 异常场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175758/

相关文章:

java - Camel 使用额外参数连接到 RabbitMQ 队列

java - 编写大 JSON 文件避免内存不足问题的最佳方法

c++ - 初始化 C++ 线程并稍后运行

java - 如何摆脱 java.lang.Exception : . .. 包含自身作为 SuiteClass

java - 同一型号不等于

java - Spring 4 + Cassandra 3.4 + 不工作

java - Java 版本的 ApkSignerTool 问题

c# - 使用 CurrentCulture 设置为任务创建者 CurrentCulture 执行任务

c# - ObjectDisposedException : Safe handle has been closed

android - getSupportActionBar() 使用 Robolectric 返回 null