Eu faco assim, uma mistura das respostas que ja tiveram aqui. Voce pode fazer os testes na camada de servico, e disparar uma exceção. Entao voce vai criar varias exceções do tipo runtimexception. Por exemplo, EntidadeJaCadastradaException, ImpossivelExcluirException, etc…
fazendo isso voce precisara de duas classes, uma sera uma handleException. Essa classe ira lidar com as exceções e criarar um modelo de mensagem de erro, essa sera a segunda classe que voce precisara. Assim toda vez que voce criar uma nova exceção voce vai adiciona-la ao handlerException. Segue abaixo o codigo.
public class DetalheErro implements Serializable {
private static final long serialVersionUID = 1L;
private Integer statusCode;
private String statusMessage;
private String httpMethod;
private String erro;
private String detalhe;
private String path;
public int getStatusCode() {
return statusCode;
}
public String getStatusMessage() {
return statusMessage;
}
public String getHttpMethod() {
return httpMethod;
}
public String getErro() {
return erro;
}
public String getDetalhe() {
return detalhe;
}
public String getPath() {
return path;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private DetalheErro erro;
Builder() {
this.erro = new DetalheErro();
}
public Builder addStatus(HttpStatus status) {
this.erro.statusCode = status.value();
this.erro.statusMessage = status.getReasonPhrase();
return this;
}
public Builder addHttpMethod(String method) {
this.erro.httpMethod = method;
return this;
}
public Builder addErro(String erro) {
this.erro.erro = erro;
return this;
}
public Builder addDetalhe(String detalhe) {
this.erro.detalhe = detalhe;
return this;
}
public Builder addPath(String path) {
this.erro.path = path;
return this;
}
public DetalheErro build() {
return this.erro;
}
}
}
@ControllerAdvice
public class ControllerAdviceExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ EmptyResultDataAccessException.class })
public ResponseEntity<Object> idInvalido(EmptyResultDataAccessException ex, WebRequest request) {
return handleExceptionInternal(ex,
DetalheErro.builder().addErro(ex.getMessage()).addStatus(HttpStatus.NOT_FOUND)
.addHttpMethod(getHttpMethod(request)).addPath(getPath(request)).build(),
new HttpHeaders(), HttpStatus.NOT_FOUND, request);
}
@ExceptionHandler({ SQLSyntaxErrorException.class })
public ResponseEntity<Object> idInvalido(SQLSyntaxErrorException ex, WebRequest request) {
return handleExceptionInternal(ex,
DetalheErro.builder().addErro(ex.getMessage()).addStatus(HttpStatus.INTERNAL_SERVER_ERROR)
.addHttpMethod(getHttpMethod(request)).addPath(getPath(request)).build(),
new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request);
}
@ExceptionHandler({ JRException.class })
public ResponseEntity<Object> idInvalido(JRException ex, WebRequest request) {
return handleExceptionInternal(ex,
DetalheErro.builder().addErro(ex.getMessage()).addStatus(HttpStatus.INTERNAL_SERVER_ERROR)
.addHttpMethod(getHttpMethod(request)).addPath(getPath(request)).build(),
new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request);
}
@ExceptionHandler({ NumberFormatException.class })
public ResponseEntity<Object> convertionNumber(NumberFormatException ex, WebRequest request) {
return handleExceptionInternal(ex,
DetalheErro.builder().addErro(ex.getMessage()).addStatus(HttpStatus.BAD_REQUEST)
.addHttpMethod(getHttpMethod(request)).addPath(getPath(request)).build(),
new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}
private String getPath(WebRequest request) {
return ((ServletWebRequest) request).getRequest().getRequestURI();
}
private String getHttpMethod(WebRequest request) {
return ((ServletWebRequest) request).getRequest().getMethod();
}
}```