我正在为 rest controller 做单元测试,这只是更大应用程序的一小部分。
我的应用程序无法识别我的测试上下文,并且出现以下异常:java.lang.IllegalStateException: Failed to load ApplicationContext
这是我的测试类:
测试 RestController
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(locations = "classpath:/META-INF/spring/context-test.xml")
@WebIntegrationTest
public class MyRestControllerTest extends AbstractTransactionnalTest {
@Autowired
private IManager manager;
@Test
// my unit tests
}
问题是,如果我使用 classes = Production.class
而不是 locations = "classpath:/META-INF/spring/context-test.xml"
以下应用程序类,它工作正常:
@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableScheduling
@ImportResource({ "classpath:/META-INF/spring/context-production.xml" })
public class Production {
// class content
}
我已经阅读了所有有类似问题的帖子,我知道它链接到 @Configuration
和 @EnableAutoConfiguration
注释但是当我尝试自定义配置类时使用了这些注解并从 context.xml 导入了它不起作用的设置。
理想情况下,我不希望添加任何配置类,只想向我的 test-context.xml
添加一个 bean。
是否可以使用我的 context.xml 中的 bean 或 TestRestController 上的注释来解决这个问题?
这是我的堆栈跟踪:
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)
... 26 more
Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
... 35 more
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185)
... 39 more
这是我用来在我的 test-context.xml 中模拟管理器的 bean:
<bean id="IManager"
class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.service.impl.Manager"/>
更新:
我尝试使用自定义管理器模拟,其中数据库被列表替换。
如果我删除注释 @WebIntegrationTest
,应用程序上下文会正确加载,但我会收到另一个异常,因为没有 @WebIntegrationTest
注释就不会启动服务器。
GET 请求网络地址时出现 I/O 错误:连接被拒绝
我在 spring 1.3.7 上运行。
最佳答案
@ContextConfiguration 定义类级元数据,用于确定如何加载和配置 ApplicationContext 以进行集成测试。具体来说,@ContextConfiguration 声明应用程序上下文资源位置或将用于加载上下文的注释类。
@ContextConfiguration("/test-config.xml") public class XmlApplicationContextTests { // class body... }
Spring Boot 提供了一个 @SpringBootTest 可以用作标准 spring-test 的替代方法的注解 @ContextConfiguration 需要 Spring Boot 功能时的注解。注释通过 SpringApplication 创建测试中使用的 ApplicationContext 来工作。
您可以使用 @SpringBootTest 的 webEnvironment 属性来进一步优化测试的运行方式。
只要您没有明确定义主配置,Spring Boot 的@*Test 注释就会自动搜索您的主配置。
搜索算法从包含测试的包开始工作,直到找到 @SpringBootApplication 或 @SpringBootConfiguration 注释类。只要您以合理的方式构建代码,通常就能找到您的主要配置。
如果您想自定义主要配置,您可以使用嵌套的@TestConfiguration 类。与将使用嵌套的@Configuration 类代替应用程序的主要配置不同,除了应用程序的主要配置之外,还将使用嵌套的@TestConfiguration 类。
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html 40.2
关于java - Spring 启动 : Unit test and Config file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40244737/