【发布时间】:2016-12-17 20:57:02
【问题描述】:
我的目标是将之前使用 Spring Boot 1.3 开发的 Spring Boot 应用程序迁移到最新的 Spring Boot 版本 1.4。该应用程序由几个 maven 模块组成,其中只有一个包含带有 @SpringBootApplication 注释的类。
迁移的一部分是使用@WebMvcTest 注释来有效地测试控制器,这里我遇到了一个问题。
考虑来自 Spring Boot github 页面的 example application。 @WebMvcTest 注释工作得很好,因为据我了解(在我做了几次测试之后),主包中有一个用@SpringBootApplication 注释的类。请注意,对于我自己的 @WebMvcTest 测试,我遵循与上面示例中所示相同的概念。
我看到的唯一区别是,在我的应用程序中,控制器类位于单独的 maven 模块中(没有 @SpringBootApplication 注释类),但具有 @Configuration 和 SpringBootConfiguration 配置。如果我不使用@SpringBootApplication 注释任何类,我在测试控制器时总是会得到一个断言。我的断言与上面示例中的 SampleTestApplication 类修改为只有 @EnableAutoConfiguration 和 @SpringBootConfiguration 注释时相同(@SpringBootApplication 不存在):
getVehicleWhenRequestingTextShouldReturnMakeAndModel(sample.test.web.UserVehicleControllerTests) Time elapsed: 0.013 sec <<< FAILURE!
java.lang.AssertionError: Status expected:<200> but was:<404>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:54)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:81)
at org.springframework.test.web.servlet.result.StatusResultMatchers$10.match(StatusResultMatchers.java:664)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171)
at sample.test.web.UserVehicleControllerTests.getVehicleWhenRequestingTextShouldReturnMakeAndModel(UserVehicleControllerTests.java:68)
我应该如何处理?为了运行 @WebMvcTest 测试,我是否应该始终使用 @SpringBootApplication 注释类?
编辑 1:我做了一个带有 2 个模块和最小配置的小型 maven 项目。它是here。现在,我得到另一个模块中定义的存储库的 NoSuchBeanDefinitionException 异常。如果我配置“完整”@SpringBootApplication - 一切都很好。
编辑 2:我从 EDIT 1 修改了小型测试项目以给出原始问题。我正在使用不同的注释并在配置类上添加了@ComponentScan,因为我怀疑 bean 没有正确注册。但是,我希望只有 @Controller bean(在 @WebMvcTest(...class) 中定义)应基于 @WebMvcTest 行为背后的魔法进行注册。
编辑 3:Spring Boot 项目issue。
【问题讨论】:
-
我让你的小项目通过了测试。不确定这是否足以回答您的问题,或者您是否需要移动一些类以更好地代表问题。
-
@ShawnClark,感谢您的尝试。您将
@SpringBootApplication添加到配置类。可能是,我之前并不完全清楚,但这个技巧也适用于我。我希望在我的模块中不需要输入@SpringBootApplication。
标签: spring-boot