Micronaut:执行Mockito测试时未调用异常处理程序



当我创建代码通过调用API抛出异常的情况时,ExceptionHandler会按预期调用。但是,当我尝试通过单元测试创建相同的用例时,ExceptionHandler不会被调用。我的课程如下:

Controller.java

@Post("/XXX")
public ResponseEntity<List<CategoryTopicBean>> listCategoryTopics(@Body CategoryIdsRequestBean categoryIdsRequestBean) {
if (categoryIdsRequestBean.getCategoryIds().size() > MAX_ALLOWED_CATEGORY_SELECTION) {
throw new CustomException(SystemConstants.ResponseCode.ERROR, SystemConstants.ResponseMessage.OVERFLOW_MAX_CATEGORIES);
}
...

CustomExceptionHandler.java:

@Produces
@Singleton
@Requires(classes = {CustomException.class, ExceptionHandler.class})
public class CustomExceptionHandler implements ExceptionHandler<CustomException, HttpResponse> {
@Override
public HttpResponse handle(HttpRequest request, CustomException exception) {
return HttpResponse.ok(new ResponseEntity<>(exception.responseCode, exception.getMessage()));
}
}

XXXShould.java

@Test
public void should_list_category_topics() {
CategoryIdsRequestBean categoryIdsBean = new CategoryIdsRequestBean();
IdBean idBean = new IdBean();
idBean.setId(ID_1);
categoryIdsBean.setCategoryIds(Arrays.asList(idBean));
ResponseEntity<List<CategoryTopicBean>> responseEntity = topicController.listCategoryTopics(categoryIdsBean);
assertThat(SystemConstants.ResponseCode.SUCCESS).isEqualTo(responseEntity.getResponseCode());
assertThat(1).isEqualTo(responseEntity.getData().size());
categoryIdsBean = new CategoryIdsRequestBean();
categoryIdsBean.setCategoryIds(Arrays.asList(idBean, idBean, idBean, idBean, idBean, idBean));
responseEntity = topicController.listCategoryTopics(categoryIdsBean);
}

有谁能调查一下,帮我一下吗?

这里的问题是,您通过直接调用控制器方法来测试控制器topicController.listCategoryTopics(categoryIdsBean)

这不是测试控制器功能的好方法。您应该使用MicronautTest。MicronautTest将启动嵌入式服务器。现在,您可以使用HTTP客户端访问端点并检索结果。

您的代码需要更改为以下行附近的内容。

@MicronautTest
class HelloWorldTest {
@Inject
@Client("/")
RxHttpClient client;
@Test
public void should_list_category_topics() {
// Test Data
CategoryIdsRequestBean categoryIdsBean = new CategoryIdsRequestBean();
IdBean idBean = new IdBean();
idBean.setId(ID_1);
categoryIdsBean.setCategoryIds(Arrays.asList(idBean));
HttpRequest<String> request = HttpRequest.POST("/XXX", categoryIdsBean);
ResponseEntity<List<CategoryTopicBean>> retrieve = client.toBlocking().retrieve(request, ResponseEntity.class);
categoryIdsBean = new CategoryIdsRequestBean();
categoryIdsBean.setCategoryIds(Arrays.asList(idBean, idBean, idBean, idBean, idBean, idBean));
responseEntity = topicController.listCategoryTopics(categoryIdsBean);
}
}

对于exception的情况,当异常处理程序返回ResponseEntity<String>时,您需要对上面的代码进行一个小的更改。

ResponseEntity<String> retrieve = client.toBlocking()
.retrieve(request, ResponseEntity.class);

如果您的控制器调用任何其他服务,请不要忘记模拟该行为。

最新更新