Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对ExceptionHandler类进行单元测试_Java_Junit5 - Fatal编程技术网

Java 对ExceptionHandler类进行单元测试

Java 对ExceptionHandler类进行单元测试,java,junit5,Java,Junit5,我正在尝试为ExceptionHandler类编写一个单元测试,但我不能100%确定如何进行。我正在努力解决如何设置带有错误列表的MethodArgumentNotValidException类 @ControllerAdvice public class InputExceptionHandler extends ResponseEntityExceptionHandler { private static final String INVALID_CHARACTER_MESSAGE

我正在尝试为ExceptionHandler类编写一个单元测试,但我不能100%确定如何进行。我正在努力解决如何设置带有错误列表的MethodArgumentNotValidException类

@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的工作),为什么不使用模拟异常呢

通过这种方式,您可以模拟您的异常需要覆盖所有路径的任何属性,而无需首先与创建异常的方法进行协作