Unitils H2 测试基础设施

1. 为什么使用Unitils H2

  • 1.1 DAO(REPOSITORY) 层的业务需要做测试,可以直接测试出SQL存在的问题,返回的结果是否是自己想要的。
  • 1.2 使用H2 避免了测试需要数据库的情况,也就是间接性的做到了数据的隔离,使得测试程序在跑的时候不受外部因素的影响,从而影响了怎么测试结果。当然H2和各个数据库的兼容需要大家好好考虑,但是大部分的情况都是兼容

2. 需要引入的jar

  • 2.1 Unitils H2 maven配置 我使用spring boot框架来作为测试
    版本 <unitils.version>3.4.2</unitils.version>
<!-- test -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-core</artifactId>
            <version>${unitils.version}</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-io</artifactId>
            <version>${unitils.version}</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-spring</artifactId>
            <version>${unitils.version}</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-dbunit</artifactId>
            <version>${unitils.version}</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-dbmaintainer</artifactId>
            <version>${unitils.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-nop</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>${assertj.version}</version>
            <scope>test</scope>
        </dependency>
  • 2.2 unitils-local.properties 配置
database.driverClassName=org.h2.Driver
database.url=jdbc:h2:mem:test
database.userName=123
database.password=123
DatabaseModule.Transactional.value.default=disabled
database.dialect=h2
database.schemaNames=public
updateDataBaseSchema.enabled=true
dbMaintainer.fromScratch.enabled=true
dbMaintainer.dbVersionSource.autoCreateVersionTable=true
dbMaintainer.autoCreateExecutedScriptsTable=true
dbMaintainer.keepRetryingAfterError.enabled=true
dbMaintainer.cleanDb.enabled=true
##建表语句
dbMaintainer.script.locations=src/test/resources/database/schema/schema.ddl
dbMaintainer.generateDataSetStructure.enabled=true
dataSetStructureGenerator.xsd.dirName=src/test/resources/database/xsd
  • 2.3 application.properties 配置
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=123
spring.datasource.password=123
spring.datasource.driver-class-name=org.h2.Driver
  • 2.4 UnitilsH2TestApplication 代码
@PropertySource("classpath:/application.properties")
@MapperScan("com.example.unitilsh2test.domain.infrastructure.model")
@ComponentScan("com.example.unitilsh2test.domain.infrastructure")
@SpringBootApplication
public class UnitilsH2TestApplication {
}
  • 2.5 UnitilsH2TestApplicationTests 代码 这个抽象类很重要 以后所有的test 类只要继承 这个类 就可以运行 Unitils了
@SpringApplicationContext({"/appContext-unit.xml"})
public abstract class UnitilsH2TestApplicationTests extends UnitilsJUnit4 {
}

  • 2.6 appContext-unit.xml 配置
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
           http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <context:annotation-config/>

    <bean name="unitilsH2TestApplication" class="com.example.unitilsh2test.common.UnitilsH2TestApplication"/>
</beans>

以上所有的配置和代码 已经搭建好了 Unitils H2 接下去只要测试自己想测试的DAO(REPOSITORY) 就可以了

3. XXXRepository 测试

  • 3.1 UserRepository 测试开发 教大家一个快速的构建测试方法

    我这里的快捷键是 command + T、快捷键修改 大家可以去看idea设置项
    image.png

    快速构建测试类
    image.png

    image.png

选择你要测试方法 就可以了

  • 3.2 UserRepositoryImplTest 代码
@DataSet(value = "/database/dataset/user.xml")
public class UserRepositoryImplTest extends UnitilsH2TestApplicationTests {

    @SpringBeanByType
    private UserRepository userRepository;

    @Test
    public void findByName() throws Exception {
        User user = userRepository.findByName("1");
        ##断言user中的变量email 的值为1 
        Assertions.assertThat(user).hasFieldOrPropertyWithValue("email", "1");
    }

}
  • 3.2 user.xml 代码 意思就是在user表中 生成一条记录
<?xml version='1.0' encoding='utf-8'?>
<dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../xsd/dataset.xsd">

    <!-- app_layout -->
    <user username="1"
          email="1"
          password="1"
        
    />

</dataset>

以上就是全部内存 直接运行就好了
附上 githua 项目地址 https://github.com/chenshengyu/unitils-h2-test.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容