spring boot rest 控制器单元测试——迹忆客-ag捕鱼王app官网
spring boot 提供了一种为 rest controller 文件编写单元测试的简单方法。 在 springjunit4classrunner
和 mockmvc
的帮助下,我们可以创建一个 web 应用程序上下文来为 rest controller 文件编写单元测试。
单元测试应该写在 src/test/java 目录下,用于编写测试的类路径资源应该放在 src/test/resources 目录下。
对于编写单元测试,我们需要在构建配置文件中添加 spring boot starter test 依赖项,如下所示。
org.springframework.boot
spring-boot-starter-test
test
gradle 用户可以在 build.gradle 文件中添加以下依赖项。
testcompile('org.springframework.boot:spring-boot-starter-test')
在编写测试用例之前,我们应该首先构建 restful web 服务。 有关构建 restful web 服务的更多信息,请参阅本教程中给出的相同章节。
为 rest 控制器编写单元测试
在本节中,让我们看看如何为 rest 控制器编写单元测试。
首先,我们需要使用 mockmvc
创建用于创建 web 应用程序上下文的抽象类文件,并定义 maptojson()
和 mapfromjson()
方法将 java 对象转换为 json 字符串,并将 json 字符串转换为 java 对象。
package com.jiyik.demo;
import java.io.ioexception;
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.springjunit4classrunner;
import org.springframework.test.context.web.webappconfiguration;
import org.springframework.test.web.servlet.mockmvc;
import org.springframework.test.web.servlet.setup.mockmvcbuilders;
import org.springframework.web.context.webapplicationcontext;
import com.fasterxml.jackson.core.jsonparseexception;
import com.fasterxml.jackson.core.jsonprocessingexception;
import com.fasterxml.jackson.databind.jsonmappingexception;
import com.fasterxml.jackson.databind.objectmapper;
@runwith(springjunit4classrunner.class)
@springboottest(classes = demoapplication.class)
@webappconfiguration
public abstract class abstracttest {
protected mockmvc mvc;
@autowired
webapplicationcontext webapplicationcontext;
protected void setup() {
mvc = mockmvcbuilders.webappcontextsetup(webapplicationcontext).build();
}
protected string maptojson(object obj) throws jsonprocessingexception {
objectmapper objectmapper = new objectmapper();
return objectmapper.writevalueasstring(obj);
}
protected t mapfromjson(string json, class clazz)
throws jsonparseexception, jsonmappingexception, ioexception {
objectmapper objectmapper = new objectmapper();
return objectmapper.readvalue(json, clazz);
}
}
接下来,编写一个继承 abstracttest
类的类文件,并为每个方法(如 get、post、put 和 delete)编写一个单元测试。
下面给出了 get api 测试用例的代码。 此 api 用于查看产品列表。
@test
public void getproductslist() throws exception {
string uri = "/products";
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.get(uri)
.accept(mediatype.application_json_value)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(200, status);
string content = mvcresult.getresponse().getcontentasstring();
product[] productlist = super.mapfromjson(content, product[].class);
asserttrue(productlist.length > 0);
}
post api 测试用例的代码如下。 此 api 用于创建产品。
@test
public void createproduct() throws exception {
string uri = "/products";
product product = new product();
product.setid("3");
product.setname("ginger");
string inputjson = super.maptojson(product);
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.post(uri)
.contenttype(mediatype.application_json_value).content(inputjson)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(201, status);
string content = mvcresult.getresponse().getcontentasstring();
assertequals(content, "product is created successfully");
}
put api 测试用例的代码如下。 此 api 用于更新现有商品。
@test
public void updateproduct() throws exception {
string uri = "/products/2";
product product = new product();
product.setname("lemon");
string inputjson = super.maptojson(product);
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.put(uri)
.contenttype(mediatype.application_json_value).content(inputjson)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(200, status);
string content = mvcresult.getresponse().getcontentasstring();
assertequals(content, "product is updated successsfully");
}
删除 api 测试用例的代码如下。 此 api 将删除现有商品。
@test
public void deleteproduct() throws exception {
string uri = "/products/2";
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.delete(uri)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(200, status);
string content = mvcresult.getresponse().getcontentasstring();
assertequals(content, "product is deleted successsfully");
}
完整的控制器测试类文件如下所示
package com.jiyik.demo;
import static org.junit.assert.assertequals;
import static org.junit.assert.asserttrue;
import org.junit.before;
import org.junit.test;
import org.springframework.http.mediatype;
import org.springframework.test.web.servlet.mvcresult;
import org.springframework.test.web.servlet.request.mockmvcrequestbuilders;
import com.tutorialspoint.demo.model.product;
public class productservicecontrollertest extends abstracttest {
@override
@before
public void setup() {
super.setup();
}
@test
public void getproductslist() throws exception {
string uri = "/products";
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.get(uri)
.accept(mediatype.application_json_value)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(200, status);
string content = mvcresult.getresponse().getcontentasstring();
product[] productlist = super.mapfromjson(content, product[].class);
asserttrue(productlist.length > 0);
}
@test
public void createproduct() throws exception {
string uri = "/products";
product product = new product();
product.setid("3");
product.setname("ginger");
string inputjson = super.maptojson(product);
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.post(uri)
.contenttype(mediatype.application_json_value)
.content(inputjson)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(201, status);
string content = mvcresult.getresponse().getcontentasstring();
assertequals(content, "product is created successfully");
}
@test
public void updateproduct() throws exception {
string uri = "/products/2";
product product = new product();
product.setname("lemon");
string inputjson = super.maptojson(product);
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.put(uri)
.contenttype(mediatype.application_json_value)
.content(inputjson)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(200, status);
string content = mvcresult.getresponse().getcontentasstring();
assertequals(content, "product is updated successsfully");
}
@test
public void deleteproduct() throws exception {
string uri = "/products/2";
mvcresult mvcresult = mvc.perform(mockmvcrequestbuilders.delete(uri)).andreturn();
int status = mvcresult.getresponse().getstatus();
assertequals(200, status);
string content = mvcresult.getresponse().getcontentasstring();
assertequals(content, "product is deleted successsfully");
}
}
现在,我们可以创建一个可执行的 jar 文件,并使用以下 maven 或 gradle 命令运行 spring boot 应用程序。
对于 maven,使用下面给出的命令
$ mvn clean install
成功之后,我们可以在 target 目录下找到 jar 文件。
对于 gradle,使用下面给出的命令
$ gradle clean build