提问人:Khaski 提问时间:9/12/2023 更新时间:9/12/2023 访问量:35
@Async测试异常用例
@Async test exception case
问:
我必须测试此代码是否抛出异常,原因方法被注释@Async异常不抛出
@Async
public CompletableFuture<Response> method(Req req) {
Response response = method(req);
return CompletableFuture.completedFuture(response);
}
private Response anotherMethod(Request req) {
String uri = getUrl();
Response response = restTemplate.postForObject(//some params);
if (response == null) {
throw new RemoteServiceException();
}
if (!response.isOk()) {
throw new RemoteServiceException(ErrorCodeConstant.Exception,
"some message");
}
return response;
}
如何在私有方法中获取测试异常情况?
答:
0赞
lane.maxwell
9/12/2023
#1
由于私有方法的响应来自对 resttemplate 的调用,因此可以模拟 resttemplate。你没有列出你的类逻辑,所以我要在这里做一些假设,你的类是命名的,你正在向其中注入一个。此外,我假设您在问题中添加的代码不是您的实际代码,因为在您的异步方法中,它只是调用自身,这将导致 StackOverflow。SomeClass
RestTemplate
您的测试将如下所示(使用 Junit4,您可以对 5 执行相同的操作,但我假设为 4,因为您仍在使用 RestTemplate)。这也假设您打算从 调用。anotherMethod
method
@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
@Mock
private RestTemplate restTemplate;
@InjectMocks
private SomeClass someclass;
@Test(expected = RemoteServiceException.class)
public void method_restTemplateValidResponse() {
when(restTemplate.postForObject(/* your matches here */)).thenReturn(null);
Req req = new Req();
someClass.method(req);
}
}
评论
0赞
Khaski
9/12/2023
如果这是非异步的,我可以在我的方法上编写测试,并且您也做了同样的事情,我需要示例来说明如何测试异常情况,因为公共方法是异步的
0赞
lane.maxwell
9/12/2023
好吧,合作伙伴,如果你仔细观察你的代码,如果出现异常,就没有 CompletableFuture,因为异常发生在这一行上:由于你没有抓住它,所以在创建 CompletableFuture 之前,它就会从你的方法中抛出。如果你想在CompletableFuture中出现异常,那么你需要向它提供一个供应商,例如你要调用的方法,如下所示:Response response = method(req);
method(Req req)
return CompletableFuture.supplyAsync(() -> anotherMethod(req))
0赞
Khaski
9/13/2023
我编写了必须抛出异常但原因方法被注释@async异常不会抛出,我如何测试异常情况?
0赞
Khaski
9/13/2023
我刚刚尝试了你的测试,但对我的情况不起作用
0赞
lane.maxwell
9/13/2023
除非您正在编写集成测试,否则注释不会计入您的测试,除非您重构方法,否则您的异常将不会包含在 CompletableFuture 中,因为异常会在创建未来之前冒泡并引发。@Async
评论