Java - Spring启动 - 集成测试 - TestEntityManager不会被注入

时间:2017-03-14 09:53:56

标签: java spring-boot integration-testing

我进行了集成测试,以测试Spring启动服务器的REST端点。

我需要创建一些数据(不使用REST端点),所以我试图使用TestEntityManager, 所以我用@SpringBootTest注释了我的测试类。到目前为止,测试启动了春季启动上下文,因此我的服务器和测试通过了。

问题: 我需要在此集成测试之外启动我的Spring启动服务器,以便为所有集成测试运行实例(而不是在每次测试时运行新实例)。 为此,我在预集成测试中使用spring-boot-maven-plugin启动服务器。 到目前为止一切顺利,它开始了。但是,为了防止我的集成测试启动自己的Spring启动服务器,我需要从我的IT类中删除@SpringBootTest注释。
然后问题就到了。 即使使用@AutoConfigureTestEntityManager注释,我的TestEntityManager也不再被注入。

有什么想法吗? 非常感谢

2017-03-14 10:42:31,371 ERROR o.s.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@56bf6f1e] to prepare test instance [be.mycompany.controllers.mediaRestControllerIT@340ef431]
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)
    ....
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testEntityManager' defined in class path resource [org/springframework/boot/test/autoconfigure/orm/jpa/TestEntityManagerAutoConfiguration.class]: Unsatisfied dependency expressed through method 'testEntityManager' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    ... 26 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)

这是代码

@RunWith(SpringRunner.class)
@ComponentScan(basePackages = {"be.mycompany"})
@AutoConfigureTestEntityManager
@Transactional
//@SpringBootTest
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class MediaRestControllerIT extends AbstractIntegrationTest {
    @Autowired
    TestEntityManager testEntityManager;

    ...
}

1 个答案:

答案 0 :(得分:0)

“我需要在此集成测试之外启动我的Spring启动服务器,以便为所有集成测试运行实例(而不是每次测试都运行一个实例)。”

您不需要这样做。当您运行一组使用@SpringBootTest注释的测试时,上下文将在测试之间进行缓存。来自文档:

“Spring的测试框架将在测试之间缓存应用程序上下文。因此,只要您的测试共享相同的配置(无论如何发现),加载上下文的潜在耗时过程只会发生一次。”

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html