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-04SpringCloud使用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-02springboot中Controller中postman遇到的傳參問題及解決
這篇文章主要介紹了springboot中Controller中postman遇到的傳參問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot基于過濾器和內(nèi)存實現(xiàn)重復(fù)請求攔截功能
這篇文章主要介紹了SpringBoot基于過濾器和內(nèi)存實現(xiàn)重復(fù)請求攔截,這里我們使用過濾器的方式對進(jìn)入服務(wù)器的請求進(jìn)行過濾操作,實現(xiàn)對相同客戶端請求同一個接口的過濾,需要的朋友可以參考下2023-01-01SpringBoot接口中如何直接返回圖片數(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