背景
在springboot工程中有时候需要对dao层进行单独的单元测试。尤其是是在多模块的项目中,dao模块和工程的入口一般不在同一个模块,此时的dao层的单元测试和一般的单元测试方式就有多不同了。那么应该如何编写此时的单元测试呢。下文将详细介绍。
dao层单元测试
添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>2.1.0</version>
<scope>test</scope>
</dependency>
注意这里要添加的是mybatis-spring-boot-starter-test,且其生效的范围是test
添加配置类
配置类用于生成单元测试中用到的一些java bean。
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
@Configuration
@MapperScan("your package class")
public class TestConfig {
//读取application-dev.properties文件的配置信息,生成DataSource对象
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/openplatform?useSSL=false&serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 指定 MyBatis 映射文件的位置
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:cxx/*.xml"));
return sessionFactory.getObject();
}
@Bean
public AtomCallbackConfigItemMapperExtTest atomCallbackConfigItemMapperExt(SqlSessionFactory factory) throws Exception {
return factory.getConfiguration().getMapper(xxx.class, factory.openSession());
}
}
编写单元测试
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Assert;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.test.context.ContextConfiguration;
@MybatisTest
@ContextConfiguration(classes = {TestConfig.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class AtomCallbackConfigItemMapperExtTest {
@Autowired
private AtomCallbackConfigItemMapperExt atomCallbackConfigItemMapperExt;
@Test
public void testSelectByConfigId() {
String result = atomCallbackConfigItemMapperExt.selectByConfigId(1L);
Assertions.assertEquals("Test Code Type", result);
}
}
其中@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 表示不使用嵌入的内存数据库,而使用自定义的外部数据。@Autowired注解用到的类就是之前TestConfig中生成的类。