Springboot项目编写测试单元完整步骤记录
目录
- 1.引入junit测试依赖及其他相关依赖
- 2.添加配置文件
- 1)- log4j2配置文件
- 2)-bootstrap.yml
- 3.在测试文件中新建启动文件
- 4.在src的目录下添加分页查询的配置文件
- 5.编写测试类
- 总结
以mapper为例编写测试单元
1.引入junit测试依赖及其他相关依赖
springboot集成了junit,引入springboot的test依赖即可
用Spring Initializr创建springboot项目时,默认会自动添加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驱动--> <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>排除,当然留着也行。
在maven中查看引入的依赖如下:
2.添加配置文件
在test文件夹下新建resources(如果没有),并右键添加到Resources Root
在resources文件夹下创建日志配置文件和bootstrap.yml文件,分别如下
1)- log4j2配置文件
log4j2配置文件每个项目都会用到,记录一个比较好用的配置文件,方便以后使用时调取,日志输出级别为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> <Rolli编程客栈ngFile 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 namphpe="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的参数改成工程实际参数 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(); //把分页拦截器添加进去,并指定按照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); //进行分页查询的单元测试 //1.拼装查询条件 //1.1 查询条件 QueryCourseParamsDto courseParamsDto = new QueryCourseParamsDto(); courseParamsDto.setCourseName("java"); courseParamsDto.setPublishStatus("202004"); //1.2新建wrapper LambdaQueryWrapper<CourseBase> queryWrapper = new LambdaQueryWrapper<>(); //1.3根据名称模糊查询,在sql中拼接course_base.name like '%值%' queryWrapper.like(StringUtils.isNotEmpty(courseParamsDto.getCourseName()), CourseBase::getName,courseParamsDto.getCourseName()); //1.4根据课程审核状态查询,在sql中拼接course_base.audit_status=? queryWrapper.eq(StringUtils.isNotEmpty(courseParamsDto.getAuditStatus()), CourseBase::getAuditStatus,courseParamsDto.getAuditStatus()); //1.4根据课程发布状态查询publishStatus queryWrapper.eq(StringUtils.isNotEmpty(courseParamsDto.getPublishStatus()), CourseBase::getAuditStatus,courseParamsDto.getPublishStatus()); //1.5创建page分页参数对象,参数:当前页码数/每页记录数 //1.5.1 获取page分页参数 PageParams pageParams = new PageParams(); pageParams.setPageNo(1L); pageParams.setPageSize(2L); //1.5.2将pageParams参数传入page Page<CourseBase> page = new Page<>(pageParams.getPageNo(), pageParams.getPageSize()); //1.6开始分页查询 Page<CourseBase> pageResult = courseBaseMapper.selectPage(page, queryWrapper); //1.7获取查询结果中的列表和总记录数 js //数据列表 List<CourseBase> records = pageResult.getRecords(); //总记录数 long total = pageResult.getTotal(); //2.1 需要最终返回一个PageResult对象,包括List<T> items, long counts, long page, long pageSize四个参数 // 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!
总结
到此这篇关于Springboot项目编写测试单元完整步骤的文章就介绍到这了,更多相关Springboot编写测试单元内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论