gpt4 book ai didi

java - 如何在 JMockit 中正确模拟私有(private) ExecutorService 的提交方法

转载 作者:行者123 更新时间:2023-11-30 10:01:00 30 4
gpt4 key购买 nike

我有一个包含私有(private) ExecutorService 实例的类。在类中,我有一个运行提交方法并捕获 RejectedExecutionException 的方法。但是,我在模拟 ExecutorService 实例以抛出异常以便完成测试覆盖时遇到了麻烦。我正在使用 JMockit 1.45。

我已经浏览过 JMockit 教程和其他站点;无论我使用@Mocked、@Capturing,还是创建一个新的假类,它似乎都不起作用。

// Implemented Class:
public class TaskRegister {

private ExecutorService executor;

public TaskRegister() {
this.executor = Executors.newFixedThreadPool(5);
}

public void executeTask(Runnable task) {
try {
this.executor.submit(task);
} catch (RejectedExecutionException e) {
System.out.println(e.getMessage);
}
}
}


// Unit Test Class:
public class TestTaskRegister {
@Tested
private TaskRegister tested;

private static int counter;

@Test // this works
public void runNormalTask() throws InterruptedException {
counter = 0;
Runnable mockTask = new Runnable() {
counter++;
}

tested.executeTask(mockTask);
Thread.sleep(100); // Allow executor to finish other thread.
assertEquals(1, counter);
}

@Test // this doesn't work, will have missing invocation error.
public void throwsError (@Capturing ExecutorService executor) throws InterruptedException {
counter = 0;

// somehow the tested class still runs the actual executor
// and not the mocked one.
new Expectations() {{
executor.submit((Runnable) any);
result = new RejectedExecutionException();
}};

Runnable mockTask = new Runnable() {
// some task
}

tested.executeTask(mockTask);
Thread.sleep(100);
assertEquals(0, counter);
}
}

我希望 @Capturing 拦截真正的执行程序实现并在调用 executor.submit 时抛出异常,但它并没有这样做。

最佳答案

通过 @Capturing 进行模拟可能代价高昂,并且在某些情况下可能会导致意外结果,因此(当前)所有 java.* 类都被排除在外。因此,java.util.concurrent.ThreadPoolExecutor 不会在此测试中被模拟(它可以使用 @Mocked)。

在实践中,RejectedExecutionException 异常永远不会发生(至少不会发生在 ThreadPoolExecutor 上——可能只发生在 ForkJoinPool 上)。所以,这个测试不值得付出努力。事实上,由于该异常是 RuntimeException,您可以简单地完全删除 catch block 。

这是(滥用)使用模拟库时发生的坏事之一:人们有时会使用它们来测试不可能的情况,因此编写无用的测试。

关于java - 如何在 JMockit 中正确模拟私有(private) ExecutorService 的提交方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57707006/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com