【问题标题】:Spring-Boot module based integration testing基于 Spring-Boot 模块的集成测试
【发布时间】:2015-03-23 06:47:13
【问题描述】:

我有一个多模块 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
    }

}

【问题讨论】:

  • 您应该在SpringApplicationConfiguration 注解中使用您的应用程序类,而不是您创建的任意配置。你真的需要@Integrationtest吗?因为这将启动您的应用程序,以便您可以使用RestTemplate 或其他任何东西来测试您的应用程序。这不是您似乎正在做或需要的。
  • 1) 我不能使用我的应用程序类,因为这个模块确实依赖于 web 模块(web 模块包含应用程序类)。 2) 为什么我需要 RestTemplate 来测试存储库?这不是网络或网络服务集成测试。
  • 你真的了解@IntegrationTest 的作用吗?从您尝试做的事情来看,它与 Spring Boot 意义上的集成测试无关。您只是在为存储库编写单元测试,而不是集成测试。
  • 尝试访问数据库并对其运行一些查询不是单元测试。
  • 在我的书中这也不是集成测试,但我们可以争论很长时间。就@IntegrationTest 的用途而言,您的测试仍然不是集成测试。所以删除它,使用@SpringApplicationConfiguration 也没有意义,因为你没有传递一个应用程序类,而只是一个配置。因此,它只是一个简单的基于弹簧的测试。

标签: spring-boot spring-test


【解决方案1】:

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

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

此外,如果您希望存储库层集成测试运行得更快(即,没有 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 { /* ... */ }

问候,

山姆

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

【讨论】:

  • 感谢您的详细解释。这是我一开始就想知道的。
【解决方案2】:

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

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

core.properties 也被主应用程序使用,它包含数据源信息。 @IntegrationTest 注解可以在测试类上去掉。

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

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

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2020-10-02
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2020-04-24
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多