当前位置: 首页 > 知识库问答 >
问题:

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

夏华藏
2023-03-14

我有一个集成测试来测试Spring Boot服务器的其余endpoint。

我需要创建一些数据(不使用RESTendpoint),所以我尝试使用TestEntityManager,所以我用@SpringBootTest注释了我的测试类。到目前为止还不错,测试启动了Spring Boot上下文,因此我的服务器和测试通过了。

问题:我需要在这个集成测试之外启动Spring Boot服务器,以便为所有集成测试运行一个实例(而不是每次测试都运行一个新实例)。为此,我在预集成测试中使用SpringBootMaven插件启动服务器。到目前为止,一切都很好,开始了。但是,为了防止集成测试启动自己的Spring Boot服务器,我需要从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个答案

冯澄邈
2023-03-14

"我需要在这个集成测试之外启动Spring Boot服务器,以便为所有集成测试运行一个实例(而不是在每个测试中运行一个新实例)。"

你不需要这样做。当您运行一组带有@SpringBootTest注释的测试时,上下文将在测试之间缓存。从文档中:

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

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

 类似资料:
  • 我正在使用以下依赖项: 创建了新的测试类: 我在Spring Boot中创建了测试用例,但是我得到了这个错误: 这是我的应用程序类: 知道我为什么不能在测试类中注入bean吗? 我按照建议删除了@ContextConfiguration,@ComponentScan,@ConnecationTes现在我看到了不同的异常:

  • 我想在Spring中测试注入依赖关系。 我想要一个这样的测试: 我尝试过使用ContextConfiguration和一个测试配置文件,但是测试失败了,我不想在测试中使用@autowired,我想创建我的类的一个实例,并且bean是自动autowired的。

  • 已删除MyTestConfig.class,但问题仍然相同。即使我使用@SpringBootTest(classes={Application.Class,MyProblematicServiceImpl.Class}),它仍然在自动连线的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类。

  • 我试图使用构造函数注入依赖模式。 我想知道在集成测试类上注入JPA存储库的正确方法是什么: RepoClass 注射后的服务 测试它:(我的问题来了) SpringRunner类选项1:构造函数注入 由于控制台输出显示: 测试类应该只有一个公共零参数构造函数 SpringRunner级选项2:自动注射 我觉得它正在打破人们想要的模式。 SpringRunner类选项3:空构造函数 正如所评论的:显

  • Spring集成头不会被注入服务激活器POJO。这只发生在负载测试时(小于10 tps)。正常流按预期工作。Spring集成流是 组织。springframework。信息。MessageHandlingException:嵌套异常是java。lang.IllegalArgumentException:所需标题不可用:组织统计数据。springframework。整合。汉德勒。方法调用消息处理器。