为什么@WebMvcTest 不将 Controller-Advices 加载到 Application-Context 中?
Why does @WebMvcTest not load Controller-Advices into the Application-Context?
你好
在我的参数化 junit5-test 中,我得到一个 NestedServletException,直到我添加
@ContextConfiguration-我的测试上方的注释 class,其中我引用了用 @ControllerAdvice 注释的自定义异常处理程序。在其中,对于我想以某种方式处理的所有异常,我都有用 @ExceptionHandler(ExceptionXY.class) 注释的方法。
抛出 NestedServletException
的示例
@ExtendWith(SpringExtension.class)
@WebMvcTest(value = SomeController.class)
@WithMockUser("123@domain.de")
class SomeControllerIntegrationTest {
@ParameterizedTest
@CsvSource({"1000,-100",
"100,1000000",
"-8,500",})
void getInfoForSomething_invalidInputCheck_Status400(int valA, int valB){
//act
mockMvc.perform(get("v1/anApiEndpoint/"+valA+"/furtherInformation/"+valB+"/getBirthday"))
.andExpect(status().isBadRequest)
...
抛出异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 javax.validation.ConstraintViolationException: SomeDto.valA: 必须小于或等于 10
@ExtendWith(SpringExtension.class)
@WebMvcTest(value = SomeController.class)
@ContextConfiguration(classes = {SomeExceptionHandler.class, SomeController.class, SomeService.class})
@WithMockUser("123@domain.de")
class SomeControllerIntegrationTest {
@ParameterizedTest
@CsvSource({"1000,-100",
"100,1000000",
"-8,500",})
void getInfoForSomething_invalidInputCheck_Status400(int valA, int valB){
//act
mockMvc.perform(get("v1/anApiEndpoint/"+valA+"/furtherInformation/"+valB+"/getBirthday"))
.andExpect(status().isBadRequest)
...
不抛出异常并且 returns 400 像预期的那样。
现在我读到@WebMvcTest 应该添加 ControllerAdvices(在这种情况下 SomeExceptionHandler.class),但在我的情况下似乎不会发生。为什么我必须自己配置上下文,有没有办法在没有 ContextConfiguration-Annotation
的情况下进行配置
更新: 自定义异常处理程序在我添加到我的 pom.xml 中的另一个启动程序中,可能会导致该错误。
使用 @WebMvcTest
,只有与 MVC 相关的组件才会填充到切片的 Spring 测试上下文中。正如您所提到的,您使用 @Configuration
从不同的启动程序激活了自定义异常处理程序,默认情况下不会填充该处理程序,因为 @WebMvcTest
不查找 @Configuration
classes.
您仍然可以在测试 class 之上使用 @Import(NameOfYourConfig.class)
手动添加您的配置,以使用更多 beans 丰富切片测试上下文。
有关详细信息,请考虑 relevant section in the Spring Boot documentation or this Spring Boot Test slice overview。
你好
在我的参数化 junit5-test 中,我得到一个 NestedServletException,直到我添加
@ContextConfiguration-我的测试上方的注释 class,其中我引用了用 @ControllerAdvice 注释的自定义异常处理程序。在其中,对于我想以某种方式处理的所有异常,我都有用 @ExceptionHandler(ExceptionXY.class) 注释的方法。
抛出 NestedServletException
@ExtendWith(SpringExtension.class)
@WebMvcTest(value = SomeController.class)
@WithMockUser("123@domain.de")
class SomeControllerIntegrationTest {
@ParameterizedTest
@CsvSource({"1000,-100",
"100,1000000",
"-8,500",})
void getInfoForSomething_invalidInputCheck_Status400(int valA, int valB){
//act
mockMvc.perform(get("v1/anApiEndpoint/"+valA+"/furtherInformation/"+valB+"/getBirthday"))
.andExpect(status().isBadRequest)
...
抛出异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 javax.validation.ConstraintViolationException: SomeDto.valA: 必须小于或等于 10
@ExtendWith(SpringExtension.class)
@WebMvcTest(value = SomeController.class)
@ContextConfiguration(classes = {SomeExceptionHandler.class, SomeController.class, SomeService.class})
@WithMockUser("123@domain.de")
class SomeControllerIntegrationTest {
@ParameterizedTest
@CsvSource({"1000,-100",
"100,1000000",
"-8,500",})
void getInfoForSomething_invalidInputCheck_Status400(int valA, int valB){
//act
mockMvc.perform(get("v1/anApiEndpoint/"+valA+"/furtherInformation/"+valB+"/getBirthday"))
.andExpect(status().isBadRequest)
...
不抛出异常并且 returns 400 像预期的那样。
现在我读到@WebMvcTest 应该添加 ControllerAdvices(在这种情况下 SomeExceptionHandler.class),但在我的情况下似乎不会发生。为什么我必须自己配置上下文,有没有办法在没有 ContextConfiguration-Annotation
的情况下进行配置更新: 自定义异常处理程序在我添加到我的 pom.xml 中的另一个启动程序中,可能会导致该错误。
使用 @WebMvcTest
,只有与 MVC 相关的组件才会填充到切片的 Spring 测试上下文中。正如您所提到的,您使用 @Configuration
从不同的启动程序激活了自定义异常处理程序,默认情况下不会填充该处理程序,因为 @WebMvcTest
不查找 @Configuration
classes.
您仍然可以在测试 class 之上使用 @Import(NameOfYourConfig.class)
手动添加您的配置,以使用更多 beans 丰富切片测试上下文。
有关详细信息,请考虑 relevant section in the Spring Boot documentation or this Spring Boot Test slice overview。