SpringBoot多模块单元测试JPA+MyBatisPlus

这篇具有很好参考价值的文章主要介绍了SpringBoot多模块单元测试JPA+MyBatisPlus。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本文章内容适合 SpringBoot多模块单系统采用H2内存测试库. 这种情况颇为复杂.因为单元测试必须要依靠主启动类程序. 多模块我试过,每个模块单独设置测试启动类.但是发现一个问题.每个模块都需要mapper扫描.需要关联依赖,还需要在那个模块中引入配置文件.否则读取不到. 也就是说单元测试的性质变了.每个模块的单元测试启动类都需要.像主启动类一样.需要完整的环境加载.这严重偏离了单元测试的目标! 但其实我的简便的正确方式就是利用了主启动类的完整的环境.有人可能会说@MockBean,或声明独立测试类.那可能会犯我后面举的三个错误.

JPA作用是代码生成表.MyBatisPlus来CRUD.取二者长处

如下将会先给出测试的简便方式.之后给出错误方式及原因!如若按照正确方式还是有问题,不妨看下三个错误方法.里面可能有解决你问题的相关原因.特别是第三个错误

一. 简便的正确方式

1.首先给出测试结构
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis

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.给出实体类介绍
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
如图@Entity,@Table,@Id,@GeneratedValue是jpa的注解.主要为了测试初始化数据时.代码生成表

5.给出主启动模块的测试类测试另一个模块的一个service方法

springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
这步需要注意的是应当保证测试包和被测试的类包路径相同,如下,下方articleServiceImpl在com.vector.service.impl包下.那测试的类也应当建在com.vector.service.impl下.否则可能找不到. 上面的配置文件名是application-test.yml.我们用@ActiveProfiles激活测试配置
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis

如果在运行时报找不到某张表,或某个字段没有因此不能生成表结构 那么一定是那个实体 或 service调mapper,mapper生成的实体
没有加上述的注解或配置的方言出错


二. 以下介绍错误方法一

项目结构描述:
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis

单元测试配置在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层
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
@SpringBootTest(classes = ArticleServiceImplTest.class)声明了这是独立测试.不依赖这个项目的任何启动类.

springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
如下报错:
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
这是因为mapperScan引起的.他扫描了本项目的所有被本模块依赖的mapper.让你必须添加这些没有用到的实体对象.
这和单元测试大相径庭.那去掉@MapperScan 加上@MockBean可以吗? 不可以!! 他是模拟数据.不会真正将数据入库!


三. 以下介绍错误方法二

方法二: 在service模块中创建测试启动类

springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
可能和主启动类模块mapper重复扫描引起.

四. 以下介绍错误方法三

方法三: 在主启动类写其他模块的测试
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
springboot跨模块测试调用,Java体系,spring boot,单元测试,mybatis
这个和简便的正确方法相近,但报错.因为我自定义配置了Bean.而我的测试文件删除了druid相关参数的配置.当bean读取配置文件,不存在这些属性.就报错.解决方法很多,我是删除bean换用配置文件自动装配.文章来源地址https://www.toymoban.com/news/detail-789466.html


到了这里,关于SpringBoot多模块单元测试JPA+MyBatisPlus的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单元测试、模块测试、web接口测试

    然而在功能的实现代码中并没有“单元”,也没有“模块”;只有函数、类和方法。先来分别看看它们 的定义: 单元测试(Unit testing),是指对软件中的最小可测试单元进行检查和验证。通常该代码块单独和孤立 的,如果您的测试使用了一些外部资源,如网络或数据库,它

    2024年02月06日
    浏览(40)
  • 测试中调用别人的服务,单元测试写法

    在Java中,进行单元测试时调用别人的服务,可以使用单元测试框架如JUnit,并结合模拟框架如Mockito来模拟或替代外部服务。 以下是一个示例,展示了在Java中进行单元测试时调用外部服务的写法: ```java import org.junit.Test; import static org.mockito.Mockito.*; public class MyServiceTest {    

    2024年02月04日
    浏览(40)
  • Mock单元测试----对Controller层进行单独测试,不调用Service层

    前言:根据相关需求,需要对编写的代码进行逻辑检测以及功能的完整性,从而开始了单元测试之路。在编写的中间段时,突然被 不经过Service层直接测试Controller层 这个要求难住了。在我看来,单元测试除了Junit还是Junit,属实是学艺不精,之后接触了Mock,才发现Mock太牛逼了

    2024年02月05日
    浏览(42)
  • Spring Boot集成单元测试调用dao,service

    温馨提示:本人开发上线视频网站,有想要的看视频的,可以看看。小松鼠

    2024年02月14日
    浏览(43)
  • mockito+junit 单元测试 测试私有方法利用反射去调用提升覆盖率 反射调用时传入参数为 null

    今天公司安排我写单元测试 因为要通过三级认证 公司要求是覆盖率必须达到100% 而在写单元测试的时候 对于是否要测试私有方法一直是一个争议 公司规范 对私有方法也进行测试 代码如下: JudgeUtils 是公司封装的一个工具类 让我们看看 isNull 方法的内部 代码如下: 我现在需

    2024年02月11日
    浏览(48)
  • 【SpringBoot】SpringBoot单元测试

    单元测试(unit testing),是指对软件中的 最小可测试单元(方法) 进⾏检查和验证的过程就叫单元测试。 单元测试是开发者编写的⼀⼩段代码, ⽤于检验被测代码的⼀个很小的、很明确的(代码)功能是否正确 。执⾏单元测试就是 为了证明某段代码的执⾏结果是否符合我

    2023年04月17日
    浏览(39)
  • 【springboot单元测试,集成测试】

    本文介绍一下SpringBoot中的测试方法 @SpringBootTest 一个普通的web api 测试类: 使用mockMvc好处是不会启动真实的web服务 当然你可以使用@SpingBootTest 并且注入一个RestTemplate来做真实的请求 假如希望仅仅测试controller层时, 可以使用另外一个注解 @WebMvcTest 他有一个参数可以指定测试

    2024年02月08日
    浏览(36)
  • Springboot单元测试之第一部分: Dao层的单元测试

    前言 :本次demo写的关于图书管理的增删改查分页等功能进行单元测试 数据库 :数据库的表结构及数据如下: 1、Pojo实体类 2、Dao数据层 简介:使用 MybatisPlus 的标准通用接口 BaseMapper 快速进行开发 3、编写Dao层的单元测试用例 1) 、根据id查询数据的测试: 2) 、插入数据的

    2024年02月15日
    浏览(38)
  • 13.Springboot整合junit5单元测试与生成单元测试覆盖率

    现在基本大公司都要求单元测试了,保证我们代码得质量,而我司更是要求覆盖率要达到60%以上,所以搞一下。 这里有两个方法: 1.使用maven自带得test,idea右侧maven模块执行项目下得test 2.使用cmd命令,在你的项目pom文件所在目录 ,打开cmd,执行如下: 结果如下:打开site文

    2024年02月16日
    浏览(40)
  • 快速上手 SpringBoot 单元测试

    ✏️作者:银河罐头 📋系列专栏:JavaEE 🌲 “种一棵树最好的时间是十年前,其次是现在” 单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 1.可以⾮常简单、直观、快速的测试某⼀个功能是否正确。 2.可以跳过项目里的其他模

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包