java - Spring 启动 : Unit test and Config file

标签 java spring unit-testing configuration

我正在为 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/

相关文章:

java - ActionListener 不工作 Java

java - 在 Java 中复制对象

Java CountDownLatch 不解锁?为什么最后一行不打印?

javascript - Jasmine Spies.and.stub 方法

angularjs - Karma 错误 - Chrome 没有在 60000 毫秒内捕获,杀死

java - 修改过滤器链 - 或者选择servlet使用过滤器响应请求

java - A* 算法的启发式

java - Spring websocket发送给特定的人

java - 是否可以通过 json-schema 检查是否仅存在必填字段?

java - 获取 EntityManager 用于测试或生产的最佳实践