最近一段时间都是在补之前的技术债,一直忙着写业务代码没有注重代码的质量,leader也在强求,所有要把单元测试搞起来了

我把单元测试分为两种 一个是service的单元测试,一个是controller层的单元测试接;

单元测试肯定要引入单元测试包maven依赖

org.junit.jupiter

junit-jupiter-api

RELEASE

opentest4j

org.opentest4j

org.springframework.boot

spring-boot-starter-test

test

在介绍两个单元测试之前说一说我们一般写单元测试是不是这样的

比如只了解service单元测试而且测试代码是这样的

@RunWith(SpringRunner.class)

@SpringBootTest(classes= {NpmcsApplication.class})public classResourceServiceTest {

@AutowiredprivateResourceService resourceService;

@Testpublic voidcountTotal() {

Map map = resourceService.countTotal("2019-10-21", "2019-10-25");

System.out.printl(map);

}

}

都是传入条件直接输出当然并不能说这种不能达到测试的效果,但是我们是追求完美的coder要追求性能和代码的美观 System.out是分非常的消耗性能的,既然是单元测试肯定要有断言,这个应该都听过

测试包下面有断言的方法提供了很多

这里有很多的断言方法比如上面的代代码可以修改为

@RunWith(SpringRunner.class)

@SpringBootTest(classes= {NpmcsApplication.class})public classResourceServiceTest {

@AutowiredprivateResourceService resourceService;

@Testpublic voidcountTotal() {

Map map = resourceService.countTotal("2019-10-21", "2019-10-25");

Assert.assertNotNull(map);

}

}

上面代码重点是, 测试类加@RunWith注解, 还有加上 @SpringBootTest(classes = App.class) 注解, 这里的 App.class 是主程序java类. 主程序java程序必须是SpringBootApplication程序, 否则测试用例会报如下错误:

Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test java.lang.IllegalStateException.

@RunWith是JUnit的一个注解, 用来告诉JUnit不要使用内置的方式进行单元测试, 而应该使用指定的类做单元测试 对于Spring单元测试总是要使用 SpringRunner.class .

@SpringBootTest 用来指定SpringBoot应用程序的入口类, 该注解默认会根据包名逐级往上找, 一直找到一个SpringBoot主程序class为止, 然后启动该类为单元测试准备Spring上下文环境.  Spring单元测试并不在每个测试方法前都移动一个全新的Spring上下文, 因为这样做太耗费时间, 而是会缓存上下文环境. 如果某个测试方法需要重新准备Spring上下文, 需要在该方法上加 @DirtiesContext 注解.

@Test注解: JUnit在执行每个测试方法之前, 都会为测试类创建一个新的实例, 这样有助于隔离各个测试方法之前的相互影响.

接下来说一下controller测试这个有点复杂用到的MockMvc,针对API测试的一个库

话不多说直接刚代码

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTestpublic classPressureViewContorllerTest {

@AutowiredprivateWebApplicationContext context;privateMockMvc mockMvc;privateMockHttpSession session;

@Beforepublic voidbefore() throws Exception {

mockMvc= MockMvcBuilders.webAppContextSetup(this.context).build();

session= newMockHttpSession();

User user= newUser();

user.setName("小明");

session.setAttribute("user", user);

}

@Afterpublic voidafter() throws Exception {

}/**

* Method: showPressure()*/@Testpublic voidtestShowPressure() throws Exception {

String json= "{\n" + "\t\"startDate\": \"2019-09-14\",\n" + "\t\"endDate\": \"2019-10-14\"\n" + "}";

MultiValueMap params = new LinkedMultiValueMap();params.add("startDate", "2019-09-14");params.add("endDate", "2019-10-14");

RequestBuilder request=MockMvcRequestBuilders.post("/pressure/pressureView").contentType(MediaType.APPLICATION_JSON)

.params(params);

MvcResult mvcResult=mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()).andDo(

MockMvcResultHandlers.print()).andReturn();int status =mvcResult.getResponse().getStatus();

String content=mvcResult.getResponse().getContentAsString();

Assert.assertTrue("正确", status == 200);

Assert.assertFalse("错误", status != 200);

}/**

* Method: pressureList()*/@Testpublic voidtestPressureList() throws Exception {

MultiValueMap params = new LinkedMultiValueMap();params.add("startDate", "2019-09-14");params.add("endDate", "2019-10-14");

RequestBuilder request=MockMvcRequestBuilders.post("/pressure/list").contentType(MediaType.APPLICATION_JSON_UTF8)

.params(params);

MvcResult mvcResult=mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()).andDo(

MockMvcResultHandlers.print()).andReturn();int status =mvcResult.getResponse().getStatus();

String content=mvcResult.getResponse().getContentAsString();

Assert.assertTrue("正确", status == 200);

Assert.assertFalse("错误", status != 200);

}

}

代代码讲解:

首先要注入MockMvc  ,MockHttpSession ,WebApplicationContext  初始化这些对象@Before这个方法是在每个Test方法之前执行,模拟登录因为登录拦截检测是否有session信息

mockMvc.perform() 模仿页面调用接口 MockMvcRequestBuilders.post("/pressure/list") 这个是掉POST方法 GET直接.get(url)

MultiValueMap params = new LinkedMultiValueMap();

params.add("startDate", "2019-09-14");

params.add("endDate", "2019-10-14");

这个是模拟参数 使用的是 MockMvcRequestBuilders.post("/pressure/list").contentType(MediaType.APPLICATION_JSON_UTF8).params(params);

也可以使用

mvc.perform(MockMvcRequestBuilders.get("/manPower/countManPowerByTeam").param("startDate","2019-01-01").param("endDate","2019-12-31")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();

这段代码:

mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk()).andDo(

MockMvcResultHandlers.print()).andReturn();

期望返回status是ok 并且打印放回的结果

最后附上启动所有的测试类方法使用的是TestSuite

/**

* 启动所有的测试类

* @Author zly

* @Date 2018/11/2 09:54*/@RunWith(Suite.class)

@Suite.SuiteClasses({TeamServiceTest.class,

PressureViewContorllerTest.class,

UserControllerTest.class,

FlowViewControllerTest.class,

HttpConnUtilTest.class, DemandPICControllerTest.class, DemandProtraitServiceTest.class})public class TestSuite {

就是把所有的测试类注入进来

有写的不好之处希望各路大佬指教 共同成长

java单元测试启动类配置_Springboot 单元测试简单介绍和启动所有测试类的方法相关推荐

  1. VB.NET 读写HTML 文件,VB.NET 简单介绍文件的读写----流类

    我们知道在计算机内部处理的数据信息以及存放在在磁盘上的文件,对于计算机而言就是一堆二进制数(字节).这些字节(甚至是位,但计算机通常按字节对它们进行分组).只有在程序解析了这些字节时,它们才具有了对用 ...

  2. 多通道振弦传感器无线采集仪参数配置工具SETP简单介绍

    多通道振弦传感器无线采集仪参数配置工具SETP简单介绍 VS208/416/432 是以振弦.温度传感信号为主的多通道无线采集仪,并可扩展其它 模拟(电流.电压.电阻)信号和数字信号(RS485.RS ...

  3. Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交

    在Java EE应用编程中Servlet是基础,JSP是建立在Servlet基础之上的,其他Web框架如Struts.WebWork和Spring MVC都是基于Servlet的.本文主要讲述MyEc ...

  4. java中runnable_Java之Runnable表达式的简单介绍

    各位小伙伴们大家好,这次小编要介绍的是Runnable表达式 当我们要启动一个线程去完成任务的时候,通常的做法会通过java.lang.Runnable接口来定义任务内容,并使用java.lang.T ...

  5. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  6. java 逻辑运算符有哪些_Java逻辑运算符的简单介绍

    各位小伙伴们,大家好,这次小编要介绍的java的逻辑运算符.在之前的文章中有这样的疑问,要进行多次判断应该如何实现?现在逻辑运算符可以帮助我们解决.逻辑运算符主要分为三种,与(&&), ...

  7. 读书类知识付费产品简单介绍

    一.读书类知识付费产品相关概念及发展 在对读书类知识付费产品进行具体剖析之前,我们首先要厘清的一个问题是,文章探讨的对象并非有声读物, 而是读书类知识付费产品,也就是业内俗称为"讲书&quo ...

  8. node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试

    WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询 (Polling)和Comet技术,Come ...

  9. 简单介绍.Net性能测试框架Crank的使用方法

    这篇文章介绍了.Net性能测试框架Crank的使用方法.对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 Crank 是微软新出的一个性能测试框架,集成了多种基准测 ...

最新文章

  1. IOS开发之UI手势
  2. 企业为什么要开通银企直联_企业为什么要把人事外包出去
  3. inputstream的大小为0_李太阳2020302期排列三推荐:本期两码看好0、3
  4. H.264 视频的 RTP 载荷格式
  5. js移除某个class_用JS添加和删除class类名
  6. jspdf html转换pdf,使用jspdf将HTML转换为pdf时出错
  7. Python精简入门级学习(二)
  8. 公网ip和私网ip的区别_自带公网IP上阿里云
  9. yum如何卸载mysql_linux下 yum 安装mysql和卸载
  10. I - Crossword Answers
  11. 中国碳酸锰(CAS+598-62-9)市场趋势报告、技术动态创新及市场预测
  12. java 端口_java – 如何找到可用的端口?
  13. 7月目标 socket , 一致性哈希算法 ; mongodb分片; 分布式消息队列; 中间件的使用场景...
  14. 生成一定范围内的互不相同的随机数的方法比较
  15. 51单片机红绿灯(十字路口智能控制系统)
  16. 三权鼎立形式的软件开发方式
  17. go语言和c运行效率,Go语言执行效率
  18. Spring Cloud Gateway 3.1.1基于redis实现动态路由和管理功能
  19. 自定义指令,实现默认头像和用户上传头像的切换
  20. 行政组织理论-阶段测评4

热门文章

  1. 在Yolov5 Yolov4 Yolov3 TensorRT 实现Implementation
  2. php set medias,laravel5.1 -- Integrate FileManager and CKeditor into laravel
  3. Retrofit 网络请求参数注解@Path @Field @Query 等使用
  4. Android Dialog 的使用总结(AlertDialog)
  5. SnackBar使用注意事项
  6. C# .NET访问Oracle的三种方法(转)
  7. js中定义变量之②var let const的区别
  8. 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里
  9. Excel中如何截取字符串中指定字符后的部分字符
  10. hadoop系统 hdfs 命令行操作