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。您可能会发现我对以下相关问题的回答也很有用:
我有一个多模块 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。您可能会发现我对以下相关问题的回答也很有用: