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