单元测试

目前了解到的几种方式:

junit

单纯使用junit,启动时相当于启动项目,配置与数据库和开发时都是保持一致的。

junit+mockito

使用mockito把一些其他模块的类进行mock,不用启动spring项目,缺点是没有数据库,对于业务代码很难写测试代码,因为主要是对业务数据进行操作,没有数据库的话数据不好准备和验证。

junit+mockito+h2

使用mockito把一些其他模块的类进行moc,使用内存数据库h2替换掉开发时的数据库,启动时会启动Spring项目,但是配置是单独的。
测试基类:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
@MapperScan(value = "com.talkweb.bigdata.security", annotationClass = Mapper.class,
        lazyInitialization = "true")
@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
public class BaseDbUnitTest {

    @Import({
            // DB 配置类
            DataSourceAutoConfiguration.class, // Spring DB 自动配置类
            DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
            DruidDataSourceAutoConfigure.class, // Druid 自动配置类
            SqlInitializationTestConfiguration.class, // SQL 初始化
            // MyBatis 配置类
            MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
    })
    public static class Application {
    }

}
测试application.yml配置:
spring:
  main:
    lazy-initialization: true # 开启懒加载,加快速度
    banner-mode: off # 单元测试,禁用 Banner

--- #################### 数据库相关配置 ####################

spring:
  # 数据源配置项
  datasource:
    name: unit-test
    url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
    driver-class-name: org.h2.Driver
    username: sa
    password:
    druid:
      async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
      initial-size: 1 # 单元测试,配置为 1,提升启动速度
  sql:
    init:
      schema-locations: classpath:/sql/create_tables.sql

  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  redis:
    host: 127.0.0.1 # 地址
    port: 16379 # 端口(单元测试,使用 16379 端口)
    database: 0 # 数据库索引


mybatis:
  lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试

总结

比较麻烦的主要是怎么准备数据,因为业务流程主要是对数据进行操作。单元测试需要验证测试结果,就需要准备初始数据,调用测试方法,再验证数据是否正确。麻烦的地方就在于准备初始数据和对处理之后的数据进行验证。