Spring-基于启动模块的集成测试

Spring-Boot module based integration testing

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

由于本模块不依赖web模块,所以没有可以启动的web应用。

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

    @Autowired CardInfoRepository cardInfoRepository;

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

}

我通过以下测试配置解决了这个问题 class。

@Configuration
@EnableAutoConfiguration
@ComponentScan
@PropertySource("classpath:core.properties")
class TestConfiguration {
}

core.properties 也被主应用程序使用,它包含数据源信息。 @IntegrationTest 注释可以在测试中移除 class.

我还将以下内容作为依赖项添加到模块中:

testRuntime 'javax.el:javax.el-api:2.2.4'
testRuntime 'org.glassfish.web:javax.el:2.2.4'

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

另一方面,如果您的测试需要特定的 Spring 引导功能(与标准 Spring 框架功能、语义和默认值形成对比),那么您实际上会想要注释您的用 @SpringApplicationConfiguration 代替 @ContextConfiguration 测试 class。原因是 @SpringApplicationConfiguration 预配置了 SpringApplicationContextLoader 特定于 Spring Boot.

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

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

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

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

此致,

山姆

p.s。您可能会发现我对以下相关问题的回答也很有用: