慢吞云雾缓吐愁 发表于 2023-6-4 18:52:16

【单元测试】Spring Data JPA + H2 测试DAO层

1. 环境配置


[*]Springboot 2.7.8
[*]h2 2.1.214
2. POM文件


[*]引入springboot parent pom
点击查看代码<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/>
</parent>

[*]引入junit , springboot-test, spring-data-jpa,H2
点击查看代码        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                  <groupId>org.junit.vintage</groupId>
                  <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
       
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
       
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>3. H2配置

H2是一款内存数据库,可以配合单测测试数据层。实现原理是将依赖的三方数据库通过内存的方式进行mock。其中H2数据库的数据表结构以及数据可以通过sql脚本文件初始化,也可以在代码中增删数据。
test/resources/h2conf.properties#使用h2数据库
spring.datasource.url=jdbc:h2:mem:test;MODE=Oracle;
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

spring.sql.init.platform=h2
#数据初始化脚本地址
spring.sql.init.schema-locations=classpath:script/schema-h2.sql
# jpa配置
spring.jpa.database=h2
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.generate-ddl=false
spring.jpa.open-in-view=true

spring.main.banner-mode=off在 test/resources/script 下创建schema-h2.sql,内容为建表语句。
4. 编写单测代码

使用 @DataJpaTest 测试spring-data-jpa 框架下的数据层,@TestPropertySource 引入指定配置文件, @ContextConfiguration 引入springboot上下文。
点击查看代码@DataJpaTest
@ContextConfiguration(classes=Application.class)
@TestPropertySource(locations = {"classpath:h2conf.properties"})
public class ServiceImplDaoTest {

    private SomeServiceImpl service;
    @Autowired
    private SomeRepository repository;
    @Autowired
    private TestEntityManager entityManager;

    @BeforeEach
    publicvoid setUp() {
      service = new SomeServiceImpl();
      ReflectionTestUtils.setField(service, "repository", repository);

    }
    @Test
    public void testSelect() {
      insertData();
      List<SomeEntity> all =         service.findAll();
      Assertions.assertEquals(10, all.size());
    }

    /**
   * for test sql
   */
    public void insertData() {
      // mock 10 data
      for (int i = 0; i < 10; i++) {
            SomeEntity entity = new SomeEntity();
            entityManager.persist(entity);
      }
    }

}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【单元测试】Spring Data JPA + H2 测试DAO层