前言
本文章内容适合 SpringBoot多模块单系统采用H2内存测试库. 这种情况颇为复杂.因为单元测试必须要依靠主启动类程序. 多模块我试过,每个模块单独设置测试启动类.但是发现一个问题.每个模块都需要mapper扫描.需要关联依赖,还需要在那个模块中引入配置文件.否则读取不到. 也就是说单元测试的性质变了.每个模块的单元测试启动类都需要.像主启动类一样.需要完整的环境加载.这严重偏离了单元测试的目标! 但其实我的简便的正确方式就是利用了主启动类的完整的环境.有人可能会说@MockBean,或声明独立测试类.那可能会犯我后面举的三个错误.
JPA作用是代码生成表.MyBatisPlus来CRUD.取二者长处
如下将会先给出测试的简便方式.之后给出错误方式及原因!如若按照正确方式还是有问题,不妨看下三个错误方法.里面可能有解决你问题的相关原因.特别是第三个错误
一. 简便的正确方式
1.首先给出测试结构
2.在主启动类模块主要需要引入的依赖(我的版本受父pom管理 spring2.6.3 mp3.5.1)
<!-- mp-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--内存测试数据库-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!--jpa代码生成表-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
3.application-test.yml配置
server:
port: 8080
# DataSource Config H2内存数据库基本数据
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:test;DATABASE_TO_UPPER=false;
username: root
password:
jpa:
# 代码自动生成表
defer-datasource-initialization: true
hibernate:
ddl-auto: update
generate-ddl: false
# 在控制台打印sql
show-sql: true
# mysql转h2方言配置
# properties:
# hibernate:
# dialect: org.hibernate.dialect.MySQL5Dialect
# MyBatis-plus配置
mybatis-plus:
# mapper的namespace可以简写
type-aliases-package: com.vector.**.domain
# mapper-locations: classpath*全包依赖扫描; classpath自己的mapper
mapper-locations: classpath*:mapper/**/*Mapper.xml
# 统一设定自增主键
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
lazy-initialization: true
4.给出实体类介绍
如图@Entity,@Table,@Id,@GeneratedValue是jpa的注解.主要为了测试初始化数据时.代码生成表
5.给出主启动模块的测试类测试另一个模块的一个service方法
这步需要注意的是应当保证测试包和被测试的类包路径相同,如下,下方articleServiceImpl在com.vector.service.impl包下.那测试的类也应当建在com.vector.service.impl下.否则可能找不到. 上面的配置文件名是application-test.yml.我们用@ActiveProfiles激活测试配置
如果在运行时报找不到某张表,或某个字段没有因此不能生成表结构
那么一定是那个实体
或 service调mapper,mapper生成的实体
没有加上述的注解或配置的方言出错
二. 以下介绍错误方法一
项目结构描述:
单元测试配置在admin的resource中.application-test.yml
server:
port: 8080
# DataSource Config
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:test;DATABASE_TO_UPPER=false
username: root
password:
# MyBatis-plus配置
mybatis-plus:
# 只有service模块的实体是pojo,其余模块为domain
type-aliases-package: com.vector.**.pojo
# mapper-locations: classpath*全包依赖扫描; classpath自己的mapper
mapper-locations: classpath*:mapper/**/*Mapper.xml
# 统一设定自增主键
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
方法一: 在service模块的测试文件中测试service层
@SpringBootTest(classes = ArticleServiceImplTest.class)声明了这是独立测试.不依赖这个项目的任何启动类.
如下报错:
这是因为mapperScan引起的.他扫描了本项目的所有被本模块依赖的mapper.让你必须添加这些没有用到的实体对象.
这和单元测试大相径庭.那去掉@MapperScan 加上@MockBean可以吗? 不可以!! 他是模拟数据.不会真正将数据入库!
三. 以下介绍错误方法二
方法二: 在service模块中创建测试启动类
可能和主启动类模块mapper重复扫描引起.文章来源:https://www.toymoban.com/news/detail-789466.html
四. 以下介绍错误方法三
方法三: 在主启动类写其他模块的测试这个和简便的正确方法相近,但报错.因为我自定义配置了Bean.而我的测试文件删除了druid相关参数的配置.当bean读取配置文件,不存在这些属性.就报错.解决方法很多,我是删除bean换用配置文件自动装配.
文章来源地址https://www.toymoban.com/news/detail-789466.html
到了这里,关于SpringBoot多模块单元测试JPA+MyBatisPlus的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!