wbl*_*nck 5 java junit spring spring-boot
有一个项目大约有 20 个控制器。每个控制器都有其对应的测试类。当我们尝试添加新的控制器测试类时,之前运行良好的一些测试开始随机失败。如果任何控制器测试类用@Ignore注释,测试将恢复正常。
这是失败的测试引发的异常:
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.IllegalStateException: org.springframework.web.context.support.GenericWebApplicationContext@22f3fadf 已关闭。
一项失败测试的完整日志:
:: Spring Boot :: (v2.0.3.RELEASE)
2019-07-04T13:01:50,325信息[pool-1-thread-17] osbStartupInfoLogger:在valhala上启动ZipCodeControllerTest,PID为17817(由/home/wblanck/Projects/project中的wblanck启动)2019-07-04T13:01: 50,325 调试 [pool-1-thread-17] osbStartupInfoLogger:使用 Spring Boot v2.0.3.RELEASE、Spring v5.0.7.RELEASE 运行 2019-07-04T13:01:50,325 信息 [pool-1-thread-17] osbSpringApplication:没有活动配置文件集,回退到默认配置文件:默认 2019-07-04T13:01:50,326 INFO [pool-1-thread-17] oscsAbstractApplicationContext:刷新 org.springframework.web.context.support.GenericWebApplicationContext@a5a2b92:启动日期[2019 年 7 月 4 日星期四 13:01:50 艺术];上下文层次结构的根 2019-07-04T13:01:50,448 INFO [pool-1-thread-17] osbfaAutowiredAnnotationBeanPostProcessor:找到 JSR-330 'javax.inject.Inject' 注释并支持自动装配
2019-07-04T13:01:50,772信息[pool-1-thread-17] oswshAbstractHandlerMethodMapping$MappingRegistry:将“{[/error]}”映射到公共org.springframework.http.ResponseEntity com.package.controller.WrongPathErrorController.badPathError (javax.servlet.http.HttpServletRequest)2019-07-04T13:01:50,772信息[pool-1-thread-17] oswshAbstractHandlerMethodMapping$MappingRegistry:映射“{[/api/users/{device}/zip-code],方法= [GET],产生= [application / json]}“到公共org.springframework.http.ResponseEntity com.package.controller.ZipCodeController.checkZipCode(java.lang.Integer,java.lang.String,java.lang。字符串、java.lang.Integer、java.lang.String)
... 更多 HandlerMethodMappings ...
2019-07-04T13:01:50,773信息[pool-1-thread-17] oswshAbstractHandlerMethodMapping$MappingRegistry:映射“{[/swagger-resources/configuration/ui]}”到公共org.springframework.http.ResponseEntity springfox.documentation .swagger.web.ApiResourceController.uiConfiguration() 2019-07-04T13:01:50,773 信息 [pool-1-thread-17] oswshAbstractHandlerMethodMapping$MappingRegistry:将“{[/swagger-resources]}”映射到公共 org.springframework 上。 http.ResponseEntity> springfox.documentation.swagger.web.ApiResourceController.swaggerResources() 2019-07-04T13:01:50,773 INFO [pool-1-thread-17] oswshAbstractHandlerMethodMapping$MappingRegistry:映射“{[/swagger-resources/configuration /security]}" 到公共 org.springframework.http.ResponseEntity springfox.documentation.swagger.web.ApiResourceController.securityConfiguration() 2019-07-04T13:01:50,824 INFO [pool-1-thread-17] sdswPropertySourcedRequestMappingHandlerMapping:映射的 URL方法 [public org.springframework.http.ResponseEntity springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)] 的路径 [/v2/api-docs] 2019-07 -04T13:01:50,859 INFO [pool-1-thread-17] oswshAbstractUrlHandlerMapping:映射的 URL 路径 [/ ]到类型[class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]的处理程序2019-07- 04T13:01:50,913信息[pool-1-thread-17] oswsmmaRequestMappingHandlerAdapter:寻找@ControllerAdvice:org.springframework.web.context.support.GenericWebApplicationContext@a5a2b92:启动日期[Thu Jul 04 13:01:50 ART 2019] ; 上下文层次结构的根 2019-07-04T13:01:50,931 INFO [pool-1-thread-17] oswshAbstractUrlHandlerMapping:映射的 URL 路径 [/webjars/] 到 [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-07-04T13:01:50,931 INFO [pool-1-thread-17] oswshAbstractUrlHandlerMapping 类型的处理程序:映射的 URL 路径 [/**] 到处理程序类型为[class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-07-04T13:01:50,938信息[pool-1-thread-17] oswsmmaExceptionHandlerExceptionResolver:在integrationExceptionHandler 2019-07-04T13:01中检测到@ExceptionHandler方法:50,981信息[pool-1-thread-17] osmwMockServletContext:初始化Spring FrameworkServlet''2019-07-04T13:01:50,981信息[pool-1-thread-17] oswsFrameworkServlet:FrameworkServlet'':初始化开始2019-07- 04T13:01:50,987信息[pool-1-thread-17] oswsFrameworkServlet:FrameworkServlet'':初始化在6毫秒内完成2019-07-04T13:01:50,995信息[pool-1-thread-17] oscsDefaultLifecycleProcessor$LifecycleGroup:正在启动2147483647阶段的bean 2019-07-04T13:01:50,995信息[pool-1-thread-17] sdswpDocumentationPluginsBootstrapper:上下文刷新2019-07-04T13:01:50,995信息[pool-1-thread-17] sdswpDocumentationPluginsBoot捆扎机:找到 1自定义文档插件 2019-07-04T13:01:50,999 INFO [pool-1-thread-17] sdswsApiListingReferenceScanner:扫描 api 列表引用 2019-07-04T13:01:51,109 INFO [pool-1-thread-17 ] osbStartupInfoLogger:在0.813秒内启动ZipCodeControllerTest(JVM运行39.78)2019-07-04T13:01:51,111信息[pool-1-thread-17] oscsAbstractApplicationContext:关闭org.springframework.web.context.support.GenericWebApplicationContext@40554129:启动日期 [Thu Jul 04 13:01:42 ART 2019];上下文层次结构的根 2019-07-04T13:01:51,112 INFO [pool-1-thread-17] oscsDefaultLifecycleProcessor$LifecycleGroup:在阶段 2147483647 中停止 beans 测试运行:3,失败:0,错误:1,跳过:0,时间经过:14.141 秒 <<< 失败!- 在 com.package.controller.ZipCodeControllerTest testInexistentCheckZipCode(com.package.controller.ZipCodeControllerTest) 中已用时间:10.648 s <<< 错误!org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.IllegalStateException:org.springframework.web.context.support.GenericWebApplicationContext@22f3fadf 已在 com.package.controller.ZipCodeControllerTest.testInexistentCheckZipCode(ZipCodeControllerTest.java:80) 处关闭 原因:java.lang。 IllegalStateException: org.springframework.web.context.support.GenericWebApplicationContext@22f3fadf 已在 com.package.controller.ZipCodeControllerTest.testInexistentCheckZipCode(ZipCodeControllerTest.java:80) 关闭
测试非常相似,基本上共同的结构是:
@RunWith(SpringRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {
private static final String URL_TEMPLATE = ".....";
@Autowired
private MockMvc mvc;
@Autowired
private ObjectMapper mapper;
@MockBean
private Service service;
private CustomParams params;
private CustomRequest request;
@Before
public void init() {
// initialize params and request ...
}
@Test
public void methodOk() throws Exception {
when(service.method(refEq(params))).thenReturn(RESPONSE);
mvc.perform(MockMvcRequestBuilders.post(URL_TEMPLATE)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(mapper.writeValueAsString(request)))
.andExpect(status().isOk())
.andExpect(jsonPath(STATUS_MESSAGE_PATH, is(MESSAGE_CODE_OK)))
.andExpect(jsonPath(STATUS_CODE_PATH, is(STATUS_OK.getStatusCode()))));
}
@Test
public void badRequest() throws Exception {
mvc.perform(MockMvcRequestBuilders.post(URL_TEMPLATE))
.andExpect(status().isBadRequest())
.andExpect(jsonPath(ERROR_MESSAGE_PATH).isNotEmpty());
}
Run Code Online (Sandbox Code Playgroud)
控制器具有如下结构:
@RestController
public class Controller {
private Service service;
@PostMapping(value = "/api/some-url", produces = {"application/json"})
public ResponseEntity<CustomResponse> method(
@RequestHeader("someheaders") Integer someHeaders,
@RequestBody CustomRequest someBody) {
CustomParams params = new CustomParams();
params.setApplicationType(applicationType);
params.someHeaders(someHeaders);
return service.method(params);
}
Run Code Online (Sandbox Code Playgroud)
我无法理解异常的原因以及它们在每次运行的不同测试中发生的事实。
由于保密原因,我更改了类和变量的名称。
您应该在测试中使用DirtiesContext注释。这将确保您在每次测试中获得清晰的上下文,并且它们不会互相干扰
| 归档时间: |
|
| 查看次数: |
4707 次 |
| 最近记录: |