Unit Test in SpringBoot
此处的Unit Test in SpringBoot 包括:
SpringApplication Test
Service Test
ControllerTest
测试项目结构如下:
代码如下:
POM.xml
<?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.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>SpringBootTest-2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBootTest-2</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
package com.app; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }
package com.app; public class Book { private Integer id;
private String name;
private String author; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public String toString() {
return String.format("Book - id: %d, name: %s, author: %s", id,name,author);
} }
package com.app; import java.awt.print.Book; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; @RestController
public class Controller { @Autowired
HelloService helloService; @GetMapping("/hello")
public String sayHi(String name) {
return helloService.sayHello(name);
} @PostMapping("/book")
public String addBook(@RequestBody Book book) {
return book.toString();
} }
package com.app; import org.springframework.stereotype.Service; @Service
public class HelloService { public String sayHello(String name) {
return "Hello " + name + "!";
}
}
UnitTest
package com.app; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class)
public class ApplicationTests { @Test
public void contextLoads() {
} }
package com.app; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext; import com.fasterxml.jackson.databind.ObjectMapper; @RunWith(SpringRunner.class)
@SpringBootTest
public class ControllerTest {
MockMvc mvc; @Autowired //模拟ServletContext环境
WebApplicationContext webApplicationContext; @Autowired
HelloService helloService; @Before
public void before() {
mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
} @Test
public void sayHiTest() throws Exception {
String uri = "/hello";
MvcResult mvcResult = mvc
.perform(MockMvcRequestBuilders.get(uri).contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("name", "World"))
.andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()) // 可以查看Request被处理的细节
.andReturn();
String content = mvcResult.getResponse().getContentAsString();
String expectedContent = "Hello World!";
Assert.assertEquals("错误,返回值和预期返回值不一致", expectedContent, content);
} @Test
public void addBookTest() throws Exception {
ObjectMapper om = new ObjectMapper();
Book book = new Book();
book.setAuthor("罗贯中");
book.setName("三国演义");
book.setId(1); String param = om.writeValueAsString(book);
String uri = "/book";
MvcResult mvcResult = mvc
.perform(MockMvcRequestBuilders.post(uri).contentType(MediaType.APPLICATION_JSON).content(param))
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn(); String content = mvcResult.getResponse().getContentAsString();
System.out.println(content); } }
package com.app; import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ControllerTestUseTestRestTemplate { /**
* 如果要使用TestRestTemplate进行测试,需要将@SPringBootTest 中webEnvironment属性的默认值由
* WebEnvironment.MOCK 修改为 WebEnvironment.DEFINED_PORT 或者 WebEnvironment.RANDOM_PORT
* 因为这两种都是使用一个真实的Servlet环境而不是模拟的Servlet环境
*/
@Autowired
TestRestTemplate restTemplate; @Test
public void sayHiTest2() { ResponseEntity<String> response = restTemplate.getForEntity("/hello?name={0}", String.class, "World");
String expectedContent = "Hello World!";
String content = response.getBody();
Assert.assertEquals("错误,返回值和预期返回值不一致", expectedContent, content);
} }
package com.app; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; import org.junit.Assert; @RunWith(SpringRunner.class)
@SpringBootTest
public class HelloServiceTest { @Autowired
HelloService helloService; @Test
public void sayHelloTest() {
String hello = helloService.sayHello("World");
Assert.assertEquals(hello, "Hello World!");
} }
package com.app; import java.io.IOException; import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.JsonTest;
import org.springframework.boot.test.json.JacksonTester;
import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class)
@JsonTest //该注解将自动配置Jackson ObjectMapper @JsonComponent 以及 Jackson Modules
public class JSONTest { @Autowired
JacksonTester<Book> jacksonTester; @Test
public void testSerialize() throws IOException {
Book book = new Book();
book.setAuthor("罗贯中");
book.setName("三国演义");
book.setId(1); Assertions.assertThat(jacksonTester.write(book)).isEqualToJson("book.json");
Assertions.assertThat(jacksonTester.write(book)).hasJsonPathStringValue("@.name");
Assertions.assertThat(jacksonTester.write(book)).extractingJsonPathStringValue("@.name").isEqualTo("三国演义");
} @Test
public void testDeserialize() throws IOException {
String content = "{ \"id\": 1, \"name\": \"三国演义\", \"author\": \"罗贯中\" }";
Assertions.assertThat(jacksonTester.parseObject(content).getName()).isEqualTo("三国演义");
}
}
package com.app; import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses; /**
* https://www.guru99.com/create-junit-test-suite.html
*
*/
@RunWith(Suite.class)
@SuiteClasses({ApplicationTests.class, ControllerTest.class, ControllerTestUseTestRestTemplate.class,
HelloServiceTest.class, JSONTest.class})
public class SuiteTests { }
book.json
{ "id": 1, "name": "三国演义", "author": "罗贯中" }
SuiteTests 的测试结果:
Unit Test in SpringBoot的更多相关文章
- SpringBoot vue
springboot 整合vue就行前后端完全分离,监听器,过滤器,拦截器 https://github.com/ninuxGithub/spring-boot-vue-separateA blog ...
- 第三章 springboot + jedisCluster(转载)
本编博客转发自:http://www.cnblogs.com/java-zhao/p/5347703.html 如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制. 如果使用的是r ...
- 第三章 springboot + jedisCluster
如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制.(具体使用方式:第九章 企业项目开发--分布式缓存Redis(1) 第十章 企业项目开发--分布式缓存Redis(2)) 如果 ...
- SpringBoot 整合Ehcache3
SpringBootLean 是对springboot学习与研究项目,是依据实际项目的形式对进行配置与处理,欢迎star与fork. [oschina 地址] http://git.oschina.n ...
- linux小白成长之路10————SpringBoot项目部署进阶
[内容指引] war包部署: jar包部署: 基于Docker云部署. 一.war包部署 通过"云开发"平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的 ...
- SpringBoot开发案例之多任务并行+线程池处理
前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...
- SpringBoot标准Properties
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- springboot application.properties 常用完整版配置信息
从springboot官方文档中扒出来的,留存一下以后应该会用到 # ================================================================= ...
- 将自己的SpringBoot应用打包发布到Linux下Docker中
目录 将自己的SpringBoot应用打包发布到Linux下Docker中 1. 环境介绍 2. 开始前的准备 2.1 开启docker远程连接 2.2 新建SpringBoot项目 3. 开始构建我 ...
随机推荐
- Hive 教程(八)-hiveserver2
hive 的另外一种启动方式是 hiveserver2,它是提供了一种服务,使得我们可以远程操作 hive,就像操作 mysql 一样 hiveserver1 既然有 hiveserver2,肯定有 ...
- mysql 相关文章
<58到家MySQL军规升级版> <数据库索引,到底是什么做的?> <MyISAM与InnoDB的索引差异究竟是啥?> <InnoDB,为何并发如此之高?&g ...
- js实现复制内容到剪贴板
一. 原生js实现,电脑可以用,手机不可以用 1. 必须是 input元素 才可以使用 <input id="code" type="text" valu ...
- Alibaba开源组件-分布式流量控制框架sentinel初探
Alibaba开源组件-分布式流量控制框架sentinel初探 2018年12月09日 18:23:11 SuperPurse 阅读数 1965更多 分类专栏: J2EE 版权声明:本文为博主原创 ...
- 比较接口:Comparable和Comparator
Comparable和Comparator是两个用于定义对象之间比较规则的接口. 一.public interface Comparator<T> Comparator接口中有两个方法(不 ...
- JAVA网络编程入门
JAVA网络编程入门 软件结构 C/S结构 B/S结构 无论哪一种结构,都离不开网络的支持.网络编程,就是在网络的条件下实现机器间的通信的过程 网络通信协议 网络通信协议:通信双方必须同时遵守才能完成 ...
- loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案
loj 爆搜? 爆搜! 先分析一下,因为我们给出的是一个排列,然后让\(i\)给\(p_i\)连边,那么我们一定会得到若干个环,最后要使得所有点度数为1,也就是这些环有完备匹配,那么最后一定全是偶环. ...
- 使用ELK进行日志分析
0x01 前言: 前段时间做应急,总是需要溯源分析,痛点是数据量比较大,想要短时间能分析出来.再者就是之前在调查某酒店事件的时候特别羡慕某产商有各种分析溯源工具.反思过后,终于在没有那么忙的时候开始搭 ...
- mysql alter 语句用法,添加、修改、删除字段、索引、主键等
修改表名: ALTER TABLE admin_user RENAME TO a_use //增加主键 [sql] view plaincopy alter table tabelname add ...
- Docker的bridge和macvlan两种网络模式
项目上部署的Docker集群创建的容器网络遇到问题,借机会学习了一下docker的网络模式,其他类型我们用的不多,这里只列举我们常用的bridge和macvlan两种,下面的描述和截图有一些是直接从网 ...