gpt4 book ai didi

基于 Spring-Boot 模块的集成测试

转载 作者:行者123 更新时间:2023-12-04 03:16:30 24 4
gpt4 key购买 nike

我有一个多模块 Spring-Boot 项目。
我想知道如何设置集成测试来测试 Spring Data JPA 存储库?以下方法因此异常而失败:
HV000183:无法加载“javax.el.E​​xpressionFactory”。检查类路径上是否有 EL 依赖项。

由于该模块不依赖于 web 模块,因此没有可以启动的 web 应用程序。

@RunWith(SpringJUnit4ClassRunner.class)
@IntegrationTest
@SpringApplicationConfiguration(classes = TestConfiguration.class)
class CardInfoRepositoryIT {

@Autowired CardInfoRepository cardInfoRepository;

@Test
void testLoadData() {
assert cardInfoRepository.findAll().size() == 1
}

}

最佳答案

正如 Marten 所说,@IntegrationTest仅当您需要针对已部署的 Spring Boot 应用程序(例如,部署在嵌入式 Tomcat、Jetty 或 Undertow 容器中)进行测试时才应使用。因此,如果您的目标是单独测试存储库层,则不应使用 @IntegrationTest .

另一方面,如果您的测试需要特定的 Spring Boot 功能(与标准 Spring Framework 功能、语义和默认值相反),那么您实际上需要使用 @SpringApplicationConfiguration 注释您的测试类。而不是 @ContextConfiguration .原因是@SpringApplicationConfiguration预配置 SpringApplicationContextLoader这是特定于 Spring Boot 的。

此外,如果您希望存储库层集成测试运行得更快(即,没有 Spring Boot 的全部开销),您可以选择排除带有 @EnableAutoConfiguration 注释的配置类。因为那会自动配置在类路径中找到自动配置的候选者。因此,例如,如果您只想让 Spring Boot 自动配置嵌入式数据库和 Spring Data JPA(使用 Hibernate 作为 JPA 提供者)以及实体扫描,您可以像这样编写测试配置:

@Configuration
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
@EntityScan(basePackageClasses = User.class)
@Import({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
public class TestRepositoryConfig {}

然后在您的测试类中使用该配置,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestRepositoryConfig.class)
@Transactional
public class UserRepositoryTests { /* ... */ }

问候,

山姆

p.s.您可能会发现我对以下相关问题的回答也很有用: Disable security for unit tests with spring boot

关于基于 Spring-Boot 模块的集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28123299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com