springboot+liquibase+h2 单元测试

本文简介如何使用spring boot, liquibase, h2, hibernate 做单元测试。 文章承接上文代码结构承接上文springboot+liquibase+hibernate 代码见github

代码架构图

见上文springboot+liquibase+hibernate

liquibase文件

见上文springboot+liquibase+hibernate

使用springboot 单元测试思路

springboot强大之处在于用application.yaml的配置文件 外加 对应的maven的 starter jar包依赖就可以 初始化一个 springcontext, 再也不用像spring那样,显示的在Configuration注解的类下面强指定spring context xml(或者 spring context config 类)。
使用springboot左单元测试也是, 我们只要创建test对应的 application配置文件就好。 application-test.yaml 然后在单元测试的类上 引入两个注解:

@RunWith(SpringRunner.class)
@SpringBootTest

就搞定一切单元测试的基础环境。 包括初始化H2数据库, 执行liquibase脚本初始化H2数据库等。

配置springboot的 application-test.yaml配置文件


    spring:
        datasource:
            driver-class-name: org.h2.Driver
            url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
            username: sa
            password: sa
            tomcat:
                test-on-borrow: true
                validation-query: SELECT 1
                max-active: 50
                max-idle: 20
                min-idle: 15
                initial-size: 1
        jpa:
            hibernate: 
                ddl-auto: none
                dialect: org.hibernate.dialect.H2Dialect
                naming:
                    physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
                format_sql: true


    liquibase:
        changeLog: "classpath:db/changelog/master.xml"


    logging:
        level:
            com.hibernate: DEBUG
            org.hibernate.SQL: DEBUG

配置 单元测试的类

@ActiveProfiles("test") 非常重要,这里会启动 application-test.yml配置


    package com.hibernate.demo;

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.hibernate.demo.domain.City;
    import com.hibernate.demo.domain.Province;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.transaction.annotation.Transactional;

    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import java.io.IOException;
    import java.io.StringWriter;
    import java.util.ArrayList;
    import java.util.List;

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    @ActiveProfiles("test")
    public class UseSpringBootTests {

        @PersistenceContext
        private EntityManager em;

        @Test
        @Transactional
        public void contextLoads() {

            List<City> citis = new ArrayList<>();
            City c = new City();
            c.setCode("c-tc");
            c.setName("test-city");

            citis.add(c);

            Province newP = new Province();
            newP.setName("test-name");
            newP.setCode("p-tc");
            newP.setCities(citis);
            c.setProvince(newP);
            em.persist(newP);
            em.flush();
            List<Province> ps = em.createQuery("select p from Province p where p.name like :name", Province.class)
                    .setParameter("name", "%test%")
                    .getResultList();
            ObjectMapper objectMapper = new ObjectMapper();
            StringWriter stringEmp = new StringWriter();
            try {
                objectMapper.writeValue(stringEmp, ps);
            } catch (IOException e) {
                e.printStackTrace();
            }

            System.out.println("Employee JSON is\n"+stringEmp);
            System.out.println("==");
        }

    }
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
慷慨打赏