1.概述
在这篇简短的文章中,我们会看到我们的控制器中应该抛出异常以及如何使用Spring MockMVC测试这些异常。
2.在控制器中抛出异常
让我们开始学习如何从控制器启动异常。
我们可以考虑我们从控制器曝光的服务,同样好像它们是正常的Java函数:
@GetMapping("/exception/throw") public void getException() throws exception {throw new exception ("error");}
现在,让我们看看我们打电话给这项服务时会发生什么。首先,我们会注意到服务的响应代码为500,这意味着内部服务器错误。
其次,我们接收到这样的响应体:
{“时间戳”:1592074599854,“状态”:500,“错误”:“内部服务器错误”,“消息”:“无消息”,“跟踪”:“java.lang.Exception在com.baeldung.controllers。金宝搏188体育ExceptionController.getException(ExceedipController.java:26)......“}
总之,当我们抛出一个例外时restcontroller.,服务响应被自动映射到500响应代码,并且阵列的堆栈跟踪包含在响应主体中。
3.映射到HTTP响应代码的异常
现在我们来学习如何将异常映射到不同的响应代码除了500年。
为实现这一目标,我们将创建自定义异常并使用ResponseStatus春天提供的注释。让我们创建这些自定义例外:
@ResponseStatus(HttpStatus.BAD_REQUEST) public class BadArgumentsException extends RuntimeException {public BadArgumentsException(String message) {super(message);}}
@ResponseStatus(httpstatus.internal_server_error)公共类InternalException扩展了Runtimeexception {public InternalException(String消息){super(消息);}}
@ResponseStatus(httpstatus.not_found)公共类ResourceNotFoundException扩展了RuntimeException {Public ResourceNotFoundException(String Message){Super(消息);}}
第二步也是最后一步是在控制器中创建一个简单的服务来抛出这些异常:
@getmapping(“/异常/ {idearion_id}”)公共void getSpecificexception(@pathVariable(“异常_ID”)字符串PException){if(“not_found”.qualsequals(pException)){投掷新resourcenotfoundException(“未找到”资源“);}否则if(“bad_arguments”.equals(pexception)){投掷新的badargumentsexception(“坏参数”);}否则{抛出新的InternalException(“内部错误”);}}
现在,让我们看看我们映射的不同异常的服务的不同响应:
- 为未找到,我们收到404响应码
- 给定的值bad_arguments.,我们收到400的响应码
- 对于任何其他值,我们仍然收到500作为响应代码
除了响应代码之外,我们将收到一个具有与前一节收到的响应机构相同格式的正文。
4.测试我们的控制器
最后,我们要去看看如何测试我们的控制器抛出正确的异常。
第一步是创建一个测试类并创建一个实例MockMvc:
@Autowired私人模仿MVC;
接下来,让我们为我们服务可以接收的每个值创建测试用例:
@test public void gendnotfound_whengetspecificyxception_thennotfoundcode()抛出异常{String ExpectionParam =“not_found”;mvc.perform(get(“/例外/ {expression_id}”,ExceptionParam).contentType(Mediatiype.application_json)).Andexpect(status()。iSnotfound()).Andexpect(结果 - > asserttrue(结果.getresolvedexception()instanceofResourceNotFoundException))).Andexpect(结果 - > assertequals(“找不到”找不到“,结果.getResolvedException()。GetMessage())));@test public voidedbadarguments_whengetspecificificyxception_thenbadrequest()抛出异常{String ExpectionParam =“Bad_Arguments”;mvc.perform(get(“/例外/ {exciption_id}”,ExceptionParam).ContentType(Mediatimpy.application_JSON)).Andexpect(status()。isbadrequest()).Andexpect(结果 - > asserttrue(结果.getresolvedexception()instanceofBadArgumentSexception)).Andexpect(结果 - > assertequals(“坏参数”,结果.getResolvedException()。GetMessage()));@test公共空白给定other_whengetspecificificyxception_theninternalservererror()抛出异常{String ExpectionParam =“虚拟”;mvc.perform(get(“/例外/ {excession_id}”,ExceptionParam).ContentType(Mediatiype.application_json)).Andexpect(status()。isinternalservererror()).Andexpect(结果 - > asserttrue(结果.getresolvedexception()instanceofInternalException)).Andexpect(结果 - > assertequals(“内部错误”,结果.getResolvedException()。GetMessage()));}
通过这些测试,我们检查响应代码,提出的异常类型以及该例外的消息是每个值的预期值。
结论
在本教程中,我们学会了如何处理春天的异常restcontroller.S以及如何测试每个公开的服务是否抛出了预期的异常。
一如既往,文章的完整源代码可用GitHub。