Java 对ExceptionHandler类进行单元测试
我正在尝试为ExceptionHandler类编写一个单元测试,但我不能100%确定如何进行。我正在努力解决如何设置带有错误列表的MethodArgumentNotValidException类Java 对ExceptionHandler类进行单元测试,java,junit5,Java,Junit5,我正在尝试为ExceptionHandler类编写一个单元测试,但我不能100%确定如何进行。我正在努力解决如何设置带有错误列表的MethodArgumentNotValidException类 @ControllerAdvice public class InputExceptionHandler extends ResponseEntityExceptionHandler { private static final String INVALID_CHARACTER_MESSAGE
@ControllerAdvice
public class InputExceptionHandler extends ResponseEntityExceptionHandler {
private static final String INVALID_CHARACTER_MESSAGE = "Fields contain invalid characters:";
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
final List<String> errorList = getErrorList(ex);
final StringBuilder errorMessage = new StringBuilder(popFirstError(errorList));
if(errorMessage.toString().contains(INVALID_CHARACTER_MESSAGE)) {
combineDuplicateErrorMessage(errorList, errorMessage);
}
return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(makeBankDetailsValidationModel(errorMessage.toString()));
}
private BankDetailsValidationModel makeBankDetailsValidationModel(String validationErrorDescription){
return new BankDetailsValidationModel(false, false, validationErrorDescription, "");
}
private StringBuilder combineDuplicateErrorMessage(List<String> errorList, StringBuilder errorMessage) {
return errorList.stream()
.filter(value -> value.contains(INVALID_CHARACTER_MESSAGE))
.findFirst()
.map(value -> errorMessage.append(", ").append(value.substring(35)))
.orElse(null);
}
private String popFirstError(List<String> errorMessages) {
final String message = errorMessages.get(0);
errorMessages.remove(0);
return message;
}
private List<String> getErrorList(MethodArgumentNotValidException ex) {
return ex.getBindingResult()
.getAllErrors()
.stream()
.map(ObjectError::getDefaultMessage)
.sorted()
.collect(Collectors.toCollection(ArrayList::new));
}
}
@ControllerAdvice
公共类InputExceptionHandler扩展了ResponseEntityExceptionHandler{
私有静态最终字符串无效\u CHARACTER\u MESSAGE=“字段包含无效字符:”;
@凌驾
受保护响应handleMethodArgumentNotValid无效(MethodArgumentNotValidException ex,
HttpHeaders和headers,
HttpStatus状态,
WebRequest(请求){
最终列表errorList=getErrorList(ex);
最终StringBuilder errorMessage=新StringBuilder(popFirstError(errorList));
if(errorMessage.toString()包含(无效字符\u消息)){
组合重复错误消息(错误列表、错误消息);
}
返回ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(makeBankDetailsValidationModel(errorMessage.toString());
}
私有BankDetailsValidationModel生成BankDetailsValidationModel(字符串验证ErrorDescription){
返回新的BankDetailsValidationModel(false、false、validationErrorDescription,“”);
}
私有StringBuilder组合应用程序错误消息(列表错误列表,StringBuilder错误消息){
返回errorList.stream()
.filter(值->值.contains(无效字符\消息))
.findFirst()
.map(value->errorMessage.append(“,”).append(value.substring(35)))
.orElse(空);
}
私有字符串popFirstError(列出错误消息){
最终字符串消息=errorMessages.get(0);
错误消息。删除(0);
返回消息;
}
私有列表getErrorList(MethodArgumentNotValidException ex){
返回例如getBindingResult()
.getAllErrors()
.stream()
.map(ObjectError::getDefaultMessage)
.已排序()
.collect(收集器.toCollection(ArrayList::new));
}
}
既然您只测试处理程序而不是调用(这是Sping的工作),为什么不使用模拟异常呢
通过这种方式,您可以模拟您的异常需要覆盖所有路径的任何属性,而无需首先与创建异常的方法进行协作