Springboot項目編寫測試單元完整步驟記錄
以mapper為例編寫測試單元
1.引入junit測試依賴及其他相關(guān)依賴
springboot集成了junit,引入springboot的test依賴即可
用Spring Initializr創(chuàng)建springboot項目時,默認(rèn)會自動添加junit的依賴。如果不使用Spring Initializr,可以手動添加依賴
<!-- spring boot 集成junit -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--Mysql驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mybatis-puls的依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<!-- 排除 Spring Boot 依賴的日志包沖突 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring Boot 集成 log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
junit-vintage-engine是使用老版本junit所需的依賴,不需要,使用<exclusions>排除,當(dāng)然留著也行。
在maven中查看引入的依賴如下:

2.添加配置文件
在test文件夾下新建resources(如果沒有),并右鍵添加到Resources Root

在resources文件夾下創(chuàng)建日志配置文件和bootstrap.yml文件,分別如下
1)- log4j2配置文件
log4j2配置文件每個項目都會用到,記錄一個比較好用的配置文件,方便以后使用時調(diào)取,日志輸出級別為debug,也可以修改
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="180" packages="">
<properties>
<property name="logdir">logs</property>
<property name="PATTERN">%date{YYYY-MM-dd HH:mm:ss,SSS} %level [%thread][%file:%line] - %msg%n%throwable</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${PATTERN}"/>
</Console>
<RollingFile name="ErrorAppender" fileName="${logdir}/error.log"
filePattern="${logdir}/$${date:yyyy-MM-dd}/error.%d{yyyy-MM-dd-HH}.log" append="true">
<PatternLayout pattern="${PATTERN}"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
<RollingFile name="DebugAppender" fileName="${logdir}/info.log"
filePattern="${logdir}/$${date:yyyy-MM-dd}/info.%d{yyyy-MM-dd-HH}.log" append="true">
<PatternLayout pattern="${PATTERN}"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
<!--異步appender-->
<Async name="AsyncAppender" includeLocation="true">
<AppenderRef ref="ErrorAppender"/>
<AppenderRef ref="DebugAppender"/>
</Async>
</Appenders>
<Loggers>
<!--過濾掉spring和mybatis的一些無用的debug信息
<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.mybatis" level="INFO">
</logger>-->
<logger name="cn.itcast.wanxinp2p.consumer.mapper" level="DEBUG">
</logger>
<logger name="springfox" level="INFO">
</logger>
<logger name="org.apache.http" level="INFO">
</logger>
<logger name="com.netflix.discovery" level="INFO">
</logger>
<logger name="RocketmqCommon" level="INFO" >
</logger>
<logger name="RocketmqRemoting" level="INFO" >
</logger>
<logger name="RocketmqClient" level="WARN">
</logger>
<logger name="org.dromara.hmily" level="WARN">
</logger>
<logger name="org.dromara.hmily.lottery" level="WARN">
</logger>
<logger name="org.dromara.hmily.bonuspoint" level="WARN">
</logger>
<!--OFF 0-->
<!--FATAL 100-->
<!--ERROR 200-->
<!--WARN 300-->
<!--INFO 400-->
<!--DEBUG 500-->
<!--TRACE 600-->
<!--ALL Integer.MAX_VALUE-->
<Root level="DEBUG" includeLocation="true">
<AppenderRef ref="AsyncAppender"/>
<AppenderRef ref="Console"/>
<AppenderRef ref="DebugAppender"/>
</Root>
</Loggers>
</Configuration>2)-bootstrap.yml
#注意datasource的參數(shù)改成工程實際參數(shù)
spring:
application:
name: content-service
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/xc_content?serverTimezone=UTC&userUnicode=true&useSSL=false&
username: root
password: myb
# 日志文件配置路徑
logging:
config: classpath:log4j2-dev.xml
3.在測試文件中新建啟動文件
在test/java文件夾下新建和src文件一樣的目錄,并在根目錄下新建啟動文件

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author may
* @version 1.0
* @description 測試類啟動文件
* @date 2025/2/4 22:37
*/
@SpringBootApplication
public class ContentApplication {
public static void main(String[] args) {
SpringApplication.run(ContentApplication.class, args);
}
}4.在src的目錄下添加分頁查詢的配置文件

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* <P>
* Mybatis-Plus 配置
* 這個文件有兩個功能:1.配置包掃描文件,即@MapperScan注解;2.bean分頁插件
* </p>
*/
@Configuration
//掃描mapper,生成mapper接口的代理對象,放到spring容器
@MapperScan("com.xuecheng.content.mapper")
public class MybatisPlusConfig {
/**
* 定義分頁攔截器
*/
//Bean需要和@Configuration配合使用才能生效
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
//重新定義一個MybatisPlus攔截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//把分頁攔截器添加進(jìn)去,并指定按照mysql分頁 語句的語法來拼裝分頁
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}5.編寫測試類
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.content.mapper.CourseBaseMapper;
import com.xuecheng.content.model.dto.QueryCourseParamsDto;
import com.xuecheng.content.model.po.CourseBase;
import org.apache.commons.lang.StringUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
/**
* @author may
* @version 1.0
* @description 單元測試
* @date 2025/2/5 20:00
*/
@SpringBootTest
public class CourseBaseMapperTests {
@Autowired
private CourseBaseMapper courseBaseMapper;
@Test
public void testCourseBaseMapper() {
CourseBase courseBase = courseBaseMapper.selectById(18L);
// System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++");
// System.out.println("courseBase=" + courseBase);
Assertions.assertNotNull(courseBase);
//進(jìn)行分頁查詢的單元測試
//1.拼裝查詢條件
//1.1 查詢條件
QueryCourseParamsDto courseParamsDto = new QueryCourseParamsDto();
courseParamsDto.setCourseName("java");
courseParamsDto.setPublishStatus("202004");
//1.2新建wrapper
LambdaQueryWrapper<CourseBase> queryWrapper = new LambdaQueryWrapper<>();
//1.3根據(jù)名稱模糊查詢,在sql中拼接course_base.name like '%值%'
queryWrapper.like(StringUtils.isNotEmpty(courseParamsDto.getCourseName()),
CourseBase::getName,courseParamsDto.getCourseName());
//1.4根據(jù)課程審核狀態(tài)查詢,在sql中拼接course_base.audit_status=?
queryWrapper.eq(StringUtils.isNotEmpty(courseParamsDto.getAuditStatus()),
CourseBase::getAuditStatus,courseParamsDto.getAuditStatus());
//1.4根據(jù)課程發(fā)布狀態(tài)查詢publishStatus
queryWrapper.eq(StringUtils.isNotEmpty(courseParamsDto.getPublishStatus()),
CourseBase::getAuditStatus,courseParamsDto.getPublishStatus());
//1.5創(chuàng)建page分頁參數(shù)對象,參數(shù):當(dāng)前頁碼數(shù)/每頁記錄數(shù)
//1.5.1 獲取page分頁參數(shù)
PageParams pageParams = new PageParams();
pageParams.setPageNo(1L);
pageParams.setPageSize(2L);
//1.5.2將pageParams參數(shù)傳入page
Page<CourseBase> page = new Page<>(pageParams.getPageNo(), pageParams.getPageSize());
//1.6開始分頁查詢
Page<CourseBase> pageResult = courseBaseMapper.selectPage(page, queryWrapper);
//1.7獲取查詢結(jié)果中的列表和總記錄數(shù)
//數(shù)據(jù)列表
List<CourseBase> records = pageResult.getRecords();
//總記錄數(shù)
long total = pageResult.getTotal();
//2.1 需要最終返回一個PageResult對象,包括List<T> items, long counts, long page, long pageSize四個參數(shù)
// PageResult<CourseBase> courseBasePageResult = new PageResult<>();
// courseBasePageResult.setItems(records);
// courseBasePageResult.setCounts(total);
// courseBasePageResult.setPage(pageParams.getPageNo());
// courseBasePageResult.setPageSize(pageParams.getPageSize());
PageResult<CourseBase> courseBasePageResult =
new PageResult<>(records, total, pageParams.getPageNo(), pageParams.getPageSize());
System.out.println(courseBasePageResult);
}
}
5.在main和test模塊中,至少要有一個模塊下有啟動文件,否則測試單元無法正常啟動,會報Test inogred!
總結(jié)
到此這篇關(guān)于Springboot項目編寫測試單元完整步驟的文章就介紹到這了,更多相關(guān)Springboot編寫測試單元內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用htmlparser提取網(wǎng)頁純文本例子
這篇文章主要介紹了java使用htmlparser提取網(wǎng)頁純文本例子,需要的朋友可以參考下2014-04-04
SpringCloud使用Feign實現(xiàn)遠(yuǎn)程調(diào)用流程詳細(xì)介紹
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02
springboot中Controller中postman遇到的傳參問題及解決
這篇文章主要介紹了springboot中Controller中postman遇到的傳參問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot基于過濾器和內(nèi)存實現(xiàn)重復(fù)請求攔截功能
這篇文章主要介紹了SpringBoot基于過濾器和內(nèi)存實現(xiàn)重復(fù)請求攔截,這里我們使用過濾器的方式對進(jìn)入服務(wù)器的請求進(jìn)行過濾操作,實現(xiàn)對相同客戶端請求同一個接口的過濾,需要的朋友可以參考下2023-01-01
SpringBoot接口中如何直接返回圖片數(shù)據(jù)
這篇文章主要介紹了SpringBoot接口中如何直接返回圖片數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
解決Springboot啟動報錯:類文件具有錯誤的版本61.0,應(yīng)為?52.0
這篇文章主要給大家介紹了關(guān)于解決Springboot啟動報錯:類文件具有錯誤的版本?61.0,應(yīng)為?52.0的相關(guān)資料,這是查閱了網(wǎng)上的很多資料才解決的,分享給大家,需要的朋友可以參考下2023-01-01

