Springboot dao层单元测试

525 阅读1分钟

背景

在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中生成的类。