教程 > spring boot 中文教程 > 阅读:101

spring boot rest 控制器单元测试——迹忆客-ag捕鱼王app官网

spring boot 提供了一种为 rest controller 文件编写单元测试的简单方法。 在 springjunit4classrunnermockmvc 的帮助下,我们可以创建一个 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

查看笔记

扫码一下
查看教程更方便
网站地图