使用内存数据库在 Spring Boot 中进行集成测试

Posted

技术标签:

【中文标题】使用内存数据库在 Spring Boot 中进行集成测试【英文标题】:Integration test in Spring Boot using in-memory database 【发布时间】:2019-11-27 14:24:06 【问题描述】:

我正在使用内存数据库(H2)进行集成测试,以便我可以使用已知值填充存储库,使用存储库初始化服务实现。这是我的测试课

@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
@SpringBootTest
public class ManufacturerServiceH2ImplTest 

    @Autowired
    private ManufacturerRepository manufacturerRepository;

    @Autowired
    ManufacturerServiceImpl manufacturerServiceImpl;


    @Test
    public void testManufacturerCreate() throws Exception 

        //Create Manufacturer
        Manufacturer manufacturer = new Manufacturer();
        manufacturer.setManufacturerId("SSS");
        manufacturer.setManufacturerName("WWW");

        //Save Manufacturer in Inmemory 
        Manufacturer manufacturerInMemory = manufacturerRepository.save(manufacturer);

        //Service Implementation
        StResponse createManufacturer = manufacturerServiceImpl.createManufacturer(manufacturer);

        //Compare the result

    


服务实现应使用内存数据库中保存的数据,并执行少量业务验证。我在这里面临的问题是服务实现实际上正在考虑指向实际数据库(在这种情况下为 postgres)而不是指向内存数据库的manufacturerRepository 实例。关于如何将manufacturerRepository 实例注入到manufacturerServiceImpl 服务实现中的任何帮助,该服务实现指向内存数据库

【问题讨论】:

我不是测试专家,但我认为在这种情况下正确的术语是集成测试而不是单元测试,因为整个 Spring Boot 上下文已经开始 【参考方案1】:

在集成测试运行时使用 Spring-Profiles 来使用 H2,否则使用另一个 DB。

application-test.yml|properties 添加到资源并将@ActiveProfiles("test") 添加到您的班级。

application-test.yml

spring.profiles.active: test

spring:
  jpa:
    database: h2
  datasource:
    url: jdbc:h2:mem:AZ
    driver-class-name: org.h2.Driver
  h2:
    console:
      enabled: true

【讨论】:

如果您需要一个工作示例,请查看我的项目:gitlab.com/phip1611/phips-photoblog/blob/dev/… 有效。但是我还需要设置ddl-auto: create-drop 才能工作。【参考方案2】:

如果您想使用您喜欢的数据库进行集成测试(testContainer - Docker 就是您正在寻找的东西 - 非常简单),请查看答案 here

【讨论】:

以上是关于使用内存数据库在 Spring Boot 中进行集成测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 测试中连接到内存中的 HSQLDB 以进行查询

Spring Boot 2.X:Spring Boot 集成 Redis

Spring boot在Spring boot中Redis的使用

在内存数据库中使用 Spring Boot 测试

Spring Boot显示获取连接及多结果集输出表值类型

spring boot:Spring Boot中Redis的使用