gpt4 book ai didi

java - Mockito "thenThrow"没有按预期抛出异常

转载 作者:行者123 更新时间:2023-11-29 04:16:54 25 4
gpt4 key购买 nike

我在尝试测试代表 Rest Client 的类时遇到问题。我在 Spring Boot 中使用 RestTemplate。

这是抽象的 RestClient 类:

    public abstract class RestClient {
...

public RestResponse sendPostRequest(URI baseUri, String resource, IRestRequest restRequest, ClassresponseClass)
throws ServerException, ClientException {

...

try {

RestTemplate restTemplate = new RestTemplate();
response = restTemplate.exchange(baseUri, HttpMethod.POST, getEntity(restRequest), responseClass);
result = response.getBody();

getLogger().debug("[{}] received", result);
return result;
} catch (HttpClientErrorException e) {
throw new ClientException(e.getCause());
} catch (HttpServerErrorException e) {
throw new ServerException(e.getCause());
} catch (Exception e) {
getLogger().error("Error with cause: {}.", e.getMessage());
}

...
}
}

这是实际的实现:

    public class ActualRestClient extends RestClient {

public RestResponse sendFetchFileRequest(URI baseUri, FetchFileRequest request) throws ServerException, ClientException {
return sendPostRequest(baseUri, "FETCH_FILE", request, RestResponse.class);
}
}

这是测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ActualRestClient.class, RestClient.class})
public class ActualResRestClientTest {

private static final String REQUEST_URI = "something";

@InjectMocks
public ActualRestClient testee;

@Mock
private RestTemplate restTemplate;


@Test(expected = ServerException.class)
public void sendPostRequestWithResponseBody_throwsServerException() throws Exception {

HttpServerErrorException httpServerErrorException = new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR);
when(restTemplate.exchange(Mockito.any(URI.class), eq(HttpMethod.POST), Mockito.any(), eq(FetchFileRequest.class))).thenThrow(httpServerErrorException);

testee.sendFetchFileRequest(new URI(REQUEST_URI), new FetchFileRequest());
}
}

ClientException 和ServerException 是我通过扩展Exception 类创建的异常。我的问题是在 RestClient 类中捕获了另一个异常(消息:“URI 不是绝对的”)而不是 HttpServerErrorException,我不明白为什么。谢谢!

最佳答案

正如评论者已经表达的那样:执行 new URI("something") 已经向您抛出了问题。但是即使你传递了一个“有效”的 URI,你的代码也不会工作,因为你的理解有误。你看:

RestTemplate restTemplate = new RestTemplate();
response = restTemplate.exchange(baseUri, HttpMethod.POST, getEntity(restRequest), responseClass);

该代码位于被测类的方法 中。但@InjectMocks 仅适用于类的字段

换句话说:当您的生产代码被执行时,一个新的(完全不同的** ResponseTemplate 实例被创建。因此您的模拟规范是无关紧要的,因为该方法不会在您的首先模拟。

两种选择:

  • 将该局部变量转换为您正在测试的类的一个字段(然后注入(inject)应该起作用)
  • 或者,由于您已经在使用 PowerMock(ito),您可以使用该模拟框架来拦截对 new() 的调用。

我建议您宁愿使用选项一,并避免完全使用 PowerMock(ito) 扩展!

关于java - Mockito "thenThrow"没有按预期抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51784838/

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