我有一个带有 Controller 和服务的 springboot 项目。还有像 GlobalExceptionHandler 这样的 -
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<Object> handle(DataIntegrityViolationException e, WebRequest request) {
....
String requestPath = ((ServletWebRequest)request).getRequest().getRequestURI();
// I am using this requestPath in my output from springboot
...
}
}
有人可以告诉我如何在我的单元测试类中编写模拟吗
((ServletWebRequest)request).getRequest().getRequestURI()
最佳答案
不幸的是,Mockito 中不支持 subbing final方法。您可以使用其他模拟框架,例如 PowerMock。
在这种情况下,我更喜欢消除使用 protected 方法进行模拟的需要:
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<Object> handle(final DataIntegrityViolationException e, final WebRequest request) {
final String requestPath = getRequestUri(request);
return ResponseEntity.ok().body(requestPath);
}
protected String getRequestUri(final WebRequest request) {
return ((ServletWebRequest) request).getRequest().getRequestURI();
}
}
测试中的匿名类:
public class GlobalExceptionHandlerTests {
private final GlobalExceptionHandler handler = new GlobalExceptionHandler() {
@Override
protected String getRequestUri(final org.springframework.web.context.request.WebRequest request) {
return "http://localhost.me";
};
};
@Test
void test() throws Exception {
final ResponseEntity<Object> handled = handler.handle(new DataIntegrityViolationException(""),
null);
assertEquals("http://localhost.me", handled.getBody());
}
}
关于Spring ExceptionalHandler 的 Java 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60212266/