簡體   English   中英

對 ExceptionHandler 類進行單元測試

[英]Unit testing an ExceptionHandler class

我正在嘗試為 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));
    }
}

既然您只是在測試處理程序而不是調用(這是 Sping 的工作),那么為什么不只使用模擬異常。

這樣你就可以模擬你的 Exception 需要覆蓋所有路徑的任何屬性,而不必首先想出創建 Exception 的方法......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM