如何在@Async方法测试异常?



如何断言在@Async方法中抛出某个异常?因为以下异常被springSimpleAsyncUncaughtExceptionHandler捕获。

@Service
public class Service {
@Async
public void run() {
throw new RuntimeException();
}
}
public class Test {
@Test
public void test() {
assertDoesNotThrow(() -> service.run()); //this always passes
}
}

如果可能的话,将异步性测试和实际的工作单元分开。例如,编写测试将执行(无'Async'功能)Service.run()并断言没有/任何/一些异常被抛出。在第二个测试中(使用@Async执行),你可以测试实际的工作单元,即使用Spring提供的bean并测试例如:

Awaitility.await().atMost(1000, TimeUnit.MILLISECONDS).untilAsserted(() -> runAnyCodeThatChecksTheResultOfYourServiceRunMethod());

另一个方法可能是将Service.run()方法的返回类型替换为java.util.concurrent。以后,Spring将重新抛出异常。从AsyncExecutionAspectSupport。handleError javadoc:

"如果方法的返回类型是{@link Future}对象(同样,如果适用的话),原始异常可以通过在更高级别抛出它来传播。然而,对于所有其他情况,异常将不会传回客户端。">

import static org.awaitility.Awaitility.await;
Awaitility.await().atMost(5, TimeUnit.SECONDS)
.untilAsserted(() -> assertThrows(RuntimeException.class, () ->  service.run()));

最新更新