【maven】【spring boot】【单元测试】 使用controller 执行单元测试类
存在这样一个场景:
当项目启动时间过长,又没办法缩短的时候,写单元测试就是一个十分耗时的工作,
这工作不在于使用编写代码,而在于每次run junit test 都需要完整启动一次项目,白白浪费宝贵的生命。
当由于某个字段没有赋值,或者某个简单判断写错,导致需要再等个3-5分钟启动 junit test,是否会想要执行一次san check?
于是乎:
假若能使用controller来调用test类方法的话,那么在本地调试单元测试时,对于一些简单的代码修改,
通过热部署,只需要重新进行一次url访问就可执行一个完整的单元测试,
无需再次启动整个项目。
正题:
1. 如何在controller访问src/test ?
2. 如何编写 ?
如何在controller访问src/test
maven项目的默认配置中, src/test目录是测试目录,不会被编译到jar中,也就是在controller调用时会报ClassNotFoundException
解决办法最好的是在pom文件中修改maven默认的测试目录,将src/test 作为正常目录使用
<build><!-- 将测试目录更改为其他目录 -->
<testSourceDirectory>src/main/test</testSourceDirectory>
</build>
需要重新maven-update。update后重新将src/test use for building path
完成后便可以成功启动项目,并可以正常访问。
如何编写
可以做一个参考:
controller,最主要内容在于使用controller时,junit的自动回滚可能不会生效,所以手动设置事务,手动触发回滚
@RestController
@RequestMapping(value = "/junit", produces = "application/json;charset=utf-8")
public class TestController { private final Logger logger = LoggerFactory.getLogger(TestController.class); @Autowired
private BizTest bizTest; @GetMapping("test")
@Transactional(rollbackFor = Exception.class)
public void startJunit() {
bizTest.insertTest();
// 手动开启事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
测试类,即可以通过其他类访问,也可以直接执行junit,增加@Componet 或者@Service 还可以通过spring注入方式调用
@Component
public class BizTest extends AbstractTest { @Autowired
private Biz biz; @Test
public void insertTest() {
// 测试业务
}
}
测试抽象父类,用于直接使用junit测试时的配置
@RunWith(SpringRunner.class)
@SpringBootTest(classes = WebApplication.class)
@Transactional
// @Rollback(false)
public abstract class AbstractTest { protected final Logger logger = LoggerFactory.getLogger(AbstractTest.class); protected void println(Object object) {
System.out.println(object);
}
}
改进: Controller 与Test类解耦
直接在controller引用Test类,提交代码后容易引起打包错误,这里就需要对两者进行解耦。
咱的解决办法如下:
利用spring动态bean注册+类限定名来令两者解耦,并令Test类接受spring容器管理,代码如下:
@GetMapping("test")
@ResponseBody
public String startJunit() {
// 测试主类限定名
String testImplName = "com.terra.test.JunitTester";
// 若bean未注册,则注册,SpringConetxtUtil可参考其余地方的Spring动态注册bean
if (SpringContextUtil.getBean(testImplName) == null) {
registerBean(testImplName);
}
try {
IJunitTest junitTester = SpringContextUtil.getBean(testImplName);
junitTester.startTest();
} catch (Exception e) {
if (e.getClass() != UnexpectedRollbackException.class) {
return e.getMessage();
}
}
logger.info("执行单元测试成功");
return "操作成功, 执行完成时间:" + DateUtil.getNowDateTime();
}
// 注册bean
private void registerBean(String className) {
DefaultListableBeanFactory beanFactory =
(DefaultListableBeanFactory) SpringContextUtil.getApplicationContext().getAutowireCapableBeanFactory();
if (beanFactory.getBean(className) == null) {
BeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(className);
beanFactory.registerBeanDefinition(className, beanDefinition);
}
}
// 单元测试主类接口
public static interface IJunitTest {
void startTest();
}
测试主类代码:
@Component
public class JunitTester extends AbstractTest implements IJunitTest { @Autowired
private BizTest1 bizTest1;
@Autowired
private BizTest2 bizTest2; @Transactional(rollbackFor = Exception.class)
@Override
public void startTest() {
// 手动开启事务回滚
bizTest1.before();
bizTest1.test();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
这样做的好处是,环境上的代码没有src/test也不会报错,而本地只需要进行注释和去除注释@RequestMapping,便无需要再修改controller代码
所有单元测试代码操作便可在测试主类及其测试类中进行,可喜可贺。
【maven】【spring boot】【单元测试】 使用controller 执行单元测试类的更多相关文章
- Spring Boot Web 开发@Controller @RestController 使用教程
在 Spring Boot 中,@Controller 注解是专门用于处理 Http 请求处理的,是以 MVC 为核心的设计思想的控制层.@RestController 则是 @Controller ...
- Spring Boot(十二)单元测试JUnit
一.介绍 JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架,开发工具Eclipse和IDEA对JUnit都有很好的支持,JUnit主要用于白盒测试和回归测试. 白盒测 ...
- 如何对Spring MVC中的Controller进行单元测试
对Controller进行单元测试是Spring框架原生就支持的能力,它可以模拟HTTP客户端发起对服务地址的请求,可以不用借助于诸如Postman这样的外部工具就能完成对接口的测试. 具体来讲,是由 ...
- Spring Boot 系列(二)单元测试&网络请求
实际开发中,Junit单元测试是必不可少的.在spring-boot 中可以通过测试模块(spring-boot-starter-test)快速使用单元测试功能. 开始 本示例在 spring boo ...
- Spring boot 项目导出可执行jar
配置文件中添加插件 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- Eclipse完成Maven + Spring Boot + Mybatis + jsp
Spring Boot 完成WEB项目开发 开发工具:eclipse 框架:Maven:Spring Boot:Mybatis 界面:jsp:javascript:css 前言: 在SpringBoo ...
- 将 Spring boot 项目打成可执行Jar包,及相关注意事项(main-class、缺少 xsd、重复打包依赖)
最近在看 spring boot 的东西,觉得很方便,很好用.对于一个简单的REST服务,都不要自己部署Tomcat了,直接在 IDE 里 run 一个包含 main 函数的主类就可以了. 但是,转念 ...
- spring boot mybatis 打成可执行jar包后启动UnsatisfiedDependencyException异常
我的spring boot + mybatis项目在idea里面执行正常,但发布测试环境打成可执行jar包后就启动失败,提示错误如下: [ ERROR] [2018-08-30 17:23:48] o ...
- Spring boot进阶-配置Controller、interceptor...
1.配置SpringBootApplication(对spring boot来说这是最基本) package io.github.syske.springboot31; import org.spri ...
随机推荐
- mysql数据库的锁表与解决办法(原博客url:http://www.cnblogs.com/wanghuaijun/p/5949934.html)
MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level loc ...
- 【GCN】图卷积网络初探——基于图(Graph)的傅里叶变换和卷积
[GCN]图卷积网络初探——基于图(Graph)的傅里叶变换和卷积 2018年11月29日 11:50:38 夏至夏至520 阅读数 5980更多 分类专栏: # MachineLearning ...
- List和Dictionary互转
// 声明Dictionary并初始化 Dictionary<string, string> dic = new Dictionary<string, string>() { ...
- hdu 5446 lucas+crt+按位乘
http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意:题目意思很简单,要你求C(n,m)mod p的值 p=p1*p2*...pn; 题解:对于C(n,m ...
- vmware centos .net core sdk开发测试
环境:vmware + centos+ .net core2.0 一.安装.net core sdk sudo rpm -Uvh https://packages.microsoft.com/conf ...
- javaIO——AutoCloseable 小试
前面在 IO 概述篇提到过,AutoCloseable 接口类会自动调用 close() 方法,那究竟具体怎么写呢?以及发生异常情况下或者多个资源是不是都能自动调用呢?我们来写一个简单的类测试一下就知 ...
- Linux环境下MySql安装和常见问题的解决
MySql安装 首先当然是要连接上linux服务器咯,然后就是下面的命令甩过去,梭哈,一通运行就是啦 梭哈 下载: sudo wget http://dev.mysql.com/get/mysql ...
- K2 BPM_K2受邀出席SAP研讨会:共话“智能+”时代下的赋能与转型_全业务流程管理专家
3月5日,第十三届全国人大二次会议在北京召开.政府工作报告首次出现“智能+”,并明确指出2019年,要打造工业互联网平台,拓展“智能+”,为制造业转型升级赋能.从政府工作报告中不难看出,“智能+” ...
- persistence.xml模板配置
1.右键创建的persistence.xml 2.选择2.0版本的模板 3.复制右侧代码,写入xml文件中 <?xml version="1.0" encoding=&quo ...
- vue打包dist文件时,图片找不到
1.vue打包dist文件时,图片找不到,无法像在本地一样查看 问题描述: 本地代码:<div class="icon"><img :src="'../ ...