作为一个优秀的Java程序员,在开发web应用中,对自己写过的代码进行单元测试是必不可少。
在IT行业中,测试有单元测试,集成测试,回归测试和自动化测试等。本文主要以上一篇的SpringBoot入门(一)的代码为基础,讲述如何在SpringBoot应用下进行单元测试。
在开始之前,我们必须了解一下单元测试的概念。单元测试是干什么的?编写测试代码,用来检测特定的、明确、细颗粒的功能。不仅仅用来保证当前代码的正确性,而且用来保证代码修复、改进或重构之后的正确性。
在这里要注意一点,单元测试是仅针对单独一个类的方法进行测试,如果被测试类的方法体依赖于其他类的方法,那么我们要为依赖类建立相应的mock对象,方可对被测试类进行单元测试。否则,在被测试类依赖其他类的情况下进行测试,俨然成了集成测试。
开发环境:
- ubuntu16.04
- idea2017
- JDK1.8
- SpringBoot 1.5.4
第一步,先查看一下项目的pom.xm文件,看看之前为了实现一个简单的RESTful API都引进了哪些模块。对RESTful API的概念不理解的同学,可去看一下《RESTful API 设计指南》,里面很清晰地讲述什么是RESTful API,而我们如何设计标准化的RESTful API。
可以看到,当前项目引用了两个模块。
- spring-boot-starter-web:web模块,保护自动化配置支持,内置tomcat以及jackson。
- spring-boot-starter-test:测试模块,包括Junit、Hamcrest、Mockito测试框架
既然已经引用了spring-boot-start-test,那么我们可以在src/test/java下建立对应前文建立的HelloWorldController.class的测试类。
第二步,创建HelloWorldControllerTest.class测试类。
第三步,编写测试代码。
package com.rocky.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
* Created by rocky on 17-7-28.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloWorldControllerTest {
@Autowired
private MockMvc mvc; /* mvc的mock对象 */
@Test
public void testHello() {
RequestBuilder request = get("/hello/"); /* 定义URL,已经发起请求为get方式 */
/* 模拟发起Http请求 */
try {
mvc.perform(request)
.andExpect(status().isOk()) /* 比较返回码是否为200 */
.andExpect(content().string(equalTo("{" + /* 比较返回内容 */
"\"msg\":\"HelloWorld\"," +
"\"status\":\"success\"" +
"}")));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行该测试,查看结果。
可以看到,测试通过。
在这里要和各位提及一下,Springboot1.4x以上版本与Springboot1.4x以下版本的单元测试有明显的区别。上述的单元测试用例不适用于Springboot1.4x以下。
完整的项目代码可在我的GitHub主页下载。