Spring JUnit 测试中未加载 ServletRegistrationBean
Spring ServletRegistrationBean not loaded in JUnit Test
我正在尝试在我的 Spring 启动应用程序中测试 Rest 服务。
当我 运行 或调试整个应用程序时,我可以成功地执行 ir。 Spring Bott start 显示以下几行,其中包括:
2015-07-02 17:04:10.654 INFO 3084 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.20
2015-07-02 17:04:10.769 INFO 3084 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2015-07-02 17:04:10.769 INFO 3084 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2449 ms
2015-07-02 17:04:11.219 INFO 3084 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2015-07-02 17:04:11.224 INFO 3084 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-07-02 17:04:11.224 INFO 3084 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
但是,当我 运行 我的 JUnit 测试时,除了 servlet 未初始化外,一切正常,请求映射正常等。的确,上面那些行没有出现。
这很奇怪,因为我 运行 使用与 运行 整个应用程序相同的 Application.class 进行测试。这是 Application.class:
@ImportResource("classpath:/META-INF/spring/integration/spring-integration-context.xml")
@SpringBootApplication
@WebAppConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
并且来自我的 JUnit 测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class CatalogRestControllerTests extends AbstractTransactionalJUnit4SpringContextTests {
...
@Test
public void someTest() {...}
}
我一直在尝试解决 servlet-context.xml 和 web.xml 配置文件中的问题。但我认为问题不存在,因为它适用于 Application.class
有什么想法吗?
谢谢!
找到了。
看来我的 JUnit class 上缺少 @WebIntegrationTest 注释。这就是文档所说的 @WebIntegrationTest:
Test class annotation signifying that the tests are "web integration
tests" and therefore require full startup in the same way as a
production application (listening on normal ports). Normally used in
conjunction with @SpringApplicationConfiguration,
This annotation can be used as an alternative to @IntegrationTest and
@WebAppConfiguration.
我正在尝试在我的 Spring 启动应用程序中测试 Rest 服务。 当我 运行 或调试整个应用程序时,我可以成功地执行 ir。 Spring Bott start 显示以下几行,其中包括:
2015-07-02 17:04:10.654 INFO 3084 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.20
2015-07-02 17:04:10.769 INFO 3084 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2015-07-02 17:04:10.769 INFO 3084 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2449 ms
2015-07-02 17:04:11.219 INFO 3084 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2015-07-02 17:04:11.224 INFO 3084 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-07-02 17:04:11.224 INFO 3084 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
但是,当我 运行 我的 JUnit 测试时,除了 servlet 未初始化外,一切正常,请求映射正常等。的确,上面那些行没有出现。
这很奇怪,因为我 运行 使用与 运行 整个应用程序相同的 Application.class 进行测试。这是 Application.class:
@ImportResource("classpath:/META-INF/spring/integration/spring-integration-context.xml")
@SpringBootApplication
@WebAppConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
并且来自我的 JUnit 测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class CatalogRestControllerTests extends AbstractTransactionalJUnit4SpringContextTests {
...
@Test
public void someTest() {...}
}
我一直在尝试解决 servlet-context.xml 和 web.xml 配置文件中的问题。但我认为问题不存在,因为它适用于 Application.class
有什么想法吗? 谢谢!
找到了。
看来我的 JUnit class 上缺少 @WebIntegrationTest 注释。这就是文档所说的 @WebIntegrationTest:
Test class annotation signifying that the tests are "web integration tests" and therefore require full startup in the same way as a production application (listening on normal ports). Normally used in conjunction with @SpringApplicationConfiguration,
This annotation can be used as an alternative to @IntegrationTest and @WebAppConfiguration.