此处的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的更多相关文章

  1. SpringBoot vue

    springboot 整合vue就行前后端完全分离,监听器,过滤器,拦截器 https://github.com/ninuxGithub/spring-boot-vue-separateA blog ...

  2. 第三章 springboot + jedisCluster(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5347703.html 如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制. 如果使用的是r ...

  3. 第三章 springboot + jedisCluster

    如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制.(具体使用方式:第九章 企业项目开发--分布式缓存Redis(1)  第十章 企业项目开发--分布式缓存Redis(2)) 如果 ...

  4. SpringBoot 整合Ehcache3

    SpringBootLean 是对springboot学习与研究项目,是依据实际项目的形式对进行配置与处理,欢迎star与fork. [oschina 地址] http://git.oschina.n ...

  5. linux小白成长之路10————SpringBoot项目部署进阶

    [内容指引] war包部署: jar包部署: 基于Docker云部署. 一.war包部署 通过"云开发"平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的 ...

  6. SpringBoot开发案例之多任务并行+线程池处理

    前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...

  7. SpringBoot标准Properties

    # =================================================================== # COMMON SPRING BOOT PROPERTIE ...

  8. springboot application.properties 常用完整版配置信息

    从springboot官方文档中扒出来的,留存一下以后应该会用到 # ================================================================= ...

  9. 将自己的SpringBoot应用打包发布到Linux下Docker中

    目录 将自己的SpringBoot应用打包发布到Linux下Docker中 1. 环境介绍 2. 开始前的准备 2.1 开启docker远程连接 2.2 新建SpringBoot项目 3. 开始构建我 ...

随机推荐

  1. O002、虚拟化

    参考https://www.cnblogs.com/CloudMan6/p/5233484.html   OpenStack 是云操作系统,要学习 OpenStack,首先需要掌握一些虚拟化和云计算的 ...

  2. 111、什么是stack (Swarm18)

    参考https://www.cnblogs.com/CloudMan6/p/8119150.html   什么是 stack ?    在将这个之前先回顾一下前面部署WordPress的过程:     ...

  3. 15 Python之内置函数

    思维导图: https://www.processon.com/mindmap/5c10cb5ee4b0090a2c9db92f 1. 匿名函数统一的名字是:<lambda> 使用场景: ...

  4. html/css弹性布局的几大常用属性详解

    弹性布局的名称概念: 1.容器:需要添加弹性布局的父元素:项目:弹性布局容器中的每一个子元素,称为项目. 2.主轴:在弹性布局中,我们会通过属性规定水平/垂直方向(flex-direction)为主轴 ...

  5. 惟一ID生成方法

    几乎所有的业务系统,都存在生成惟一ID的需求,例如: 用户ID:user_id 订单ID: order_id 消息ID: msg_id 常见的ID生成有三大类方法: 一.中间件实现 1.利用Mysql ...

  6. 多线程之实现Runnable接口及其优点

    多线程之实现Runnable接口: 1.创建一个Runnable接口的实现类 2.在实现类中重写Runnable接口的run方法 3.创建一个Runnable接口实现类的对象 4.创建Thread类对 ...

  7. BeanUtils组件的使用

    BeanUtils能够使我们更方便的进行javabean的赋值操作,它的底层是反射的原理 主要方法有 copyProperties(Object object,String name,String v ...

  8. Delphi MainMenu组件

  9. backtop返回页面顶部jquery代码

    <div id="toTop" style="width:30px;height:110px;border:1px solid #74B9DC; border-ra ...

  10. libusb读写

    https://blog.csdn.net/u012247418/article/details/83684980 https://github.com/crazybaoli/libusb-test ...