-
2021-11-20 21:17:34
在UTDD的流程中,通常会从上到下进行模拟,流程如下:
Controller接口单元测试
–》Controller接口代码实现
–》Api接口单元测试
–》Api接口代码实现那么我们先从Controller的单元测试模拟开始:
一、MockMvc功能介绍:
MockMvc是由spring-test包提供,实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。接口MockMvcBuilder,提供一个唯一的build方法,用来构造MockMvc。
主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装和集成Web环境测试(并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。
MockMvcBuilders提供了对应的创建方法standaloneSetup方法和webAppContextSetup方法,在使用时直接调用即可。二、代码示例:
首先是pom坐标:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>loan-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>loan-server</name> <description>loan-server</description> <properties> <java.version>1.8</java.version> <testcontainers.version>1.16.0</testcontainers.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.24</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <exclusions> <exclusion> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> </exclusion> </exclusions> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.jmockit/jmockit --> <dependency> <groupId>org.jmockit</groupId> <artifactId>jmockit</artifactId> <version>1.19</version> <scope>test</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.197</version> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers-bom</artifactId> <version>${testcontainers.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.Controller接口测试类:
@RunWith(SpringRunner.class) @AutoConfigureMockMvc @SpringBootTest(classes = LoanServerApplication.class)//这里放启动类 public class LoanControllerTest { MockMvc mockMvc; @Autowired private WebApplicationContext webApplicationContext; @Before public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) .addFilter(((request, response, chain) -> { response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); })).build(); } @Test public void should_get_userLoanPlan_success_byGet() throws Exception { String result = mockMvc.perform( get("/loan-plans/{idCard}", "412233333333")) .andExpect(status().isOk()) .andReturn() .getResponse() .getContentAsString(); String expected = "{\"createdAt\":\"2021-11-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-11-23T00:41:49.257512\"}"; JSONComparator comparator = new CustomComparator(JSONCompareMode.LENIENT, new Customization("id", (o1, o2) -> true), new Customization("createdAt", (o1, o2) -> true), new Customization("updatedAt", (o1, o2) -> true) ); JSONAssert.assertEquals(expected, result, comparator); } @Test public void should_get_userLoanPlan_success_byPost() throws Exception { String result = mockMvc.perform( post("/loan-plans/{idCard}", "412233333333")) .andExpect(status().isOk()) .andReturn() .getResponse() .getContentAsString(); String expected = "{\"createdAt\":\"2021-11-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-11-23T00:41:49.257512\"}"; JSONComparator comparator = new CustomComparator(JSONCompareMode.LENIENT, new Customization("id", (o1, o2) -> true), new Customization("createdAt", (o1, o2) -> true), new Customization("updatedAt", (o1, o2) -> true) ); JSONAssert.assertEquals(expected, result, comparator); } }
3、Controller接口代码
@RestController @RequestMapping("loan-plans") public class LoanController { @GetMapping("/{idCard}") public JSONObject getUserLoadPlanMaterial(@PathVariable String idCard) { String result = "{\"createdAt\":\"2021-10-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-10-23T00:41:49.257512\"}"; return JSONObject.parseObject(result); } @PostMapping("/{idCard}") public JSONObject Test(@PathVariable String idCard) { String result = "{\"createdAt\":\"2021-10-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-10-23T00:41:49.257512\"}"; return JSONObject.parseObject(result); } }
这里我们通过MockMvc实现了一个简单的get/post请求接口的模拟及单元测试的编写~ 有兴趣的可以尝试一下~ 还可以拓展一些其他接口的单元测试~
喜欢的朋友欢迎一键三连。我们一起学习,进步~~
更多相关内容 -
SpringBoot Controller Post接口单元测试示例
2020-08-26 15:40:56今天小编就为大家分享一篇关于SpringBoot Controller Post接口单元测试示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
Spring Boot从Controller层进行单元测试的实现
2020-08-19 07:08:52主要介绍了Spring Boot从Controller层进行单元测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
springBoot使用单元测试controller接口
2021-06-22 14:42:29在Spring Boot中实现单元测试同样非常方便,下面我们打开src/test/下的测试入口com.cloud.demo.DemoApplicationTests类,编写一个简单的单元测试来模拟HTTP请求,测试之前实现的/hello接口,该接口应返回Hello world...在Spring Boot中实现单元测试同样非常方便,下面我们打开src/test/下的测试入口com.cloud.demo.DemoApplicationTests类,编写一个简单的单元测试来模拟HTTP请求,测试之前实现的/hello接口,该接口应返回Hello world字符串。
具体代码实现如下所示。
@SpringBootTest class DemoApplicationTests { private MockMvc mvc; @Before public void setUp() throws Exception { mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build(); System.out.println("初始化mock模块"); } @Test void hello() throws Exception { setUp(); String responseString = mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) //返回的状态是200 .andDo(print()) //打印出请求和相应的内容 .andReturn().getResponse().getContentAsString(); //将相应的数据转换为字符串; System.out.println("获取结果为:" + responseString); } }
controller接口内容如下:
@RestController public class HelloController { @RequestMapping(value = "/hello",method = RequestMethod.GET) public String inde(){ return "Hello SpringCloud"; } }
测试结果如下:
-
单元测试调用Controller-Service层接口
2022-04-11 11:11:03单元测试调用Controller-Service层接口Contoller层接口:
代码:
@RunWith(SpringRunner.class) @SpringBootTest public class ControllerTest { @Autowired private UserController userController; @Test public void loginuser(){ User user=new User(); user.setUsername("jack"); user.setPwd("1234"); JsonData jsonData=userController.login(user); System.out.println(jsonData.toString()); TestCase.assertEquals(0,jsonData.getCode()); } }
效果截图:
1.输入错误密码
2.输入正确密码:
Service层接口:
代码:
@RunWith(SpringRunner.class) @SpringBootTest public class ServiceTest { @Autowired private VideoService videoService; @Test public void list(){ List<Video> list=videoService.listVideo(); System.out.println(list.toString()); TestCase.assertTrue(list.size()>0); } }
效果截图:
-
ASP.NET Core对Controller进行单元测试的完整步骤
2020-12-17 04:45:34很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今天来演示下如果对Controller进行单元测试。以下内容默认您对单元测试... -
SpringBoot:单元测试:实战单元测试调用Controller-service层接口(2)
2020-11-29 16:11:56案例实战Controller层登陆方法测试 具体方法看不懂的小伙伴可看之前的get、post请求文章,这里只做具体调用讲解 @RunWith(SpringRunner.class) @SpringBootTest(classes={ProjectApplication.class}) public class ...案例实战Controller层登陆方法测试
具体方法看不懂的小伙伴可看之前的get、post请求文章,这里只做具体调用讲解
@RunWith(SpringRunner.class) @SpringBootTest(classes={ProjectApplication.class}) public class UserTest { //注入controller @Autowired private UserController userController; /** * 测试用户登陆接口 */ @Test public void loginTest(){ User user = new User(); user.setUsername("张三"); user.setPwd("123"); //调用controller层方法 JsonData jsonData = userController.loginUser(user); System.out.println(jsonData.toString()); //断言 //判断状态码 预期是0返回正确 TestCase.assertEquals(0,jsonData.getCode()); } }
案例实战 视频列表Service层的单元测试
@RunWith(SpringRunner.class) @SpringBootTest(classes={ProjectApplication.class}) public class VideoTest { //注入视频接口 @Autowired private VideoService videoService; @Before public void testOne(){ System.out.println("这是个测试 before"); } /** * 视频接口测试 */ @Test public void testVideoList(){ //调用service层接口方法 返回集合对象 List<Video> videoList = videoService.listVideo(); //判断对象是否为空 预期是大于0 TestCase.assertTrue(videoList.size()>0); } @After public void testThree(){ System.out.println("这是个测试 after"); } }
使用IDEA快捷方式创建测试类
无需手动去创建测试类方法,使用idea自带方式去new
Step1:选择接口方法鼠标右键
Step2:选择要测试的接口方法
这样在Test包下就自动生成了测试类了根据公司情况,写单元测试,核心接口一定要写,非核心的尽量写
断言类型,可以细化,我这里只是判断了长度和非空,也可以判断结果为1或者2
-
Java Junit 单元测试controller层接口的方法
2019-10-11 17:01:154.需要获得接口得返回值用以进行其他接口得关联: @Test public void createNewOrEditFile ( ) throws Exception { //创建文件夹 RequestBuilder request ; request = post ( "/api/v1/... -
单元测试和接口测试的区别
2019-06-20 20:33:401、单元测试注重代码逻辑,接口测试注重业务逻辑; 2、单元测试的粒度最小,是测试最小独立的单元模块(不依赖其他模块);接口测试不是,会覆盖很多; 3、单元测试是白盒测试,接口测试是黑盒测试; 4、单元测试... -
springboot对controller方法进行单元测试
2022-01-08 17:12:48springboot对controller方法进行单元测试 -
springboot进行controller单元测试
2021-09-29 09:05:47作为现在微服务开发基础的springboot,有必要针对这个框架的单元测试进行必要的探讨,尤其是controller接口的单元测试。springboot针对单元测试提供了很多辅助注解,了解了这些注解就可以轻松的使用这些特性进行... -
springboot增加接口级别单元测试
2021-06-03 10:42:36springboot增加接口及单元测试 增加基类接口 SpringBootUnitTest @SpringBootTest @Transactional @Rollback @RunWith(SpringRunner.class) public class BaseUnitTest { @Autowired private ... -
SpringBoot Controller Post接口单元测试
2018-10-31 09:49:32而对于controller层,一般不怎么做单元测试,因为主要的核心业务逻辑都在service层里,controller层只是做转发,调用service层接口而已。但是还是建议使用单元测试简单的将controller的方法跑一下,看看转发和数据... -
使用RestTemplate 测试Controller接口
2020-06-11 19:40:56TestRestTemplate主要用于测试url请求后返回来的结果 RestTemplate 默认使用 jackson 完成 json 序列化和反序列化. 示例: 第一步:Maven依赖: <dependency> <groupId>org.springframework.boot</... -
controller层单元测试
2021-11-09 11:19:57@Autowired WebApplicationContext webApplicationContext; private static final String baseUrl = "/user"; private MockMvc mvc; ... private RequestBuilder ... /**初始化测试环境*/ @BeforeEach public .. -
SpringBoot:单元测试:MockMvc案例实战调用Controller层API接口(3)
2020-11-29 16:18:57之前讲的是调用...如何测试Controller对外提供的接口 增加类注解 @AutoConfigureMockMvc 注入一个MockMvc类 相关API : perform执行一个RequestBuilder请求 andExpect:添加ResultMatcher->MockMvcResultMa -
springboot @SpringBootTest单元测试调用controller接口
2019-03-04 17:40:03下面介绍了get、post、put、delete四种请求方式 @Test public void testGetMethod() throws Exception { MvcResult result = mockMvc.perform(get("/face/match")) .andExpect(status().isOk())// 模拟... -
Gradle单元测试
2019-09-18 10:55:38Gradle单元测试 我们可以通过在Gradle添加Java插件来执行单元测试的任务,默认的,在项目中所有的测试都会被执行,如果我们只想测试其中一个类,我们可以使用Java系统属性test.single作为测试的名字,事实上,这个... -
Spring项目单元测试,测试service层、controller层(对spring restfull 接口单元测试)
2018-11-06 13:13:30通过java配置的方式搭建的一个基本的web项目,零xml配置,主要用于单元测试示例,使用了spring支持h2内存数据库,不需要额外安装数据库,可以测试controller层、service层,项目使用的打包工具为gradle,比maven配置... -
SpringBoot 登录接口单元测试(Shiro方式)
2021-04-23 11:52:05SpringBoot 登录接口单元测试 1.针对登录接口获取Token package com.demo.test.controller; import com.alibaba.fastjson.JSONObject; import com.demo.test.Application; import com.demo.test.req.auth.LoginReq;... -
Spring Boot下编写Controller层单元测试(一)
2019-12-11 23:47:13如何写一个最简单的Controller层单元测试 -
SpringBoot快速建立单元测试(IDEA版本)
2020-06-27 23:18:04此处单元测试只做一个简单的笔记指引,至于具体使用到的类或注解可以自己去拓展学习,水平有限,欢迎指教 一、业务层方法测试 第一步 :选中对应的类,建立单元测试方法 这里如果已经建立了测试类的测试方法,... -
梦想成现实:用xUnit.net在单元测试中实现构造函数依赖注入
2021-01-31 12:55:44通过构造函数进行依赖注入,避免了在代码中针对所依赖的接口创建相应的实例,这个改由IoC容器在运行时自动完成。我们主要在APS.NETMVC的Controller与应用层的服务实现中使用。比如下面的APS。NETMVCController示例... -
【保姆级教程】Spring Boot单元测试(Controller层的Header处有Token验证的详细示例代码),文末介绍Postman ...
2021-01-10 18:04:57文章目录一、 单元测试的概念二、单元测试的作用三、Spring Boot引入的MockMvc的概念四、Service层的单元测试五、Controller层的单元测试六、断言的概念七、新断言assertThat使用八、Postman与Spring Boot 单元测试... -
spring boot 单元测试调用controller接口
2020-06-11 17:56:36import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest;...import org.springframework.test.context.junit4.Spri. -
ASP.NET Core 对Controller进行单元测试
2021-02-13 09:00:00单元测试对我们的代码质量非常重要。很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今... -
使用Mock对接口(controller层)进行单元测试
2016-11-21 16:33:24在近些天单元测试的过程中,遇到了各种需要使用Mock的情况,现总结记录。本文不对PowerMock和EasyMock进行讲解,因为我也不懂他俩的深层含义和区别。