SpringBoot单元测试之Mock方式

一、主程序

package com.kyy.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动程序
 * @Auther:zhouhongliang
 * @Date:2019/7/30
 * @Description:
 */
@SpringBootApplication
public class SpringBootDemo {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemo.class,args);
    }
}

二、处理器

package com.kyy.springboot.controller;

import com.kyy.springboot.model.Person;
import org.springframework.web.bind.annotation.*;

/**
 * @Auther:zhouhongliang
 * @Date:2019/7/30
 * @Description:
 */
@RestController
public class HelloController {
    /**
     * 无参访问
     *
     * @return
     */
    @RequestMapping("/hello")
    public String hello() {
        return "hello word";
    }

    /**
     * restful 风格访问
     *
     * @param name
     * @return
     */
    @RequestMapping("/hello1/{name}")
    public String hello1(@PathVariable(name = "name") String name) {
        return "hello " + name;
    }

    /**
     * get 访问,传递参数
     *
     * @param par1
     * @param par2
     * @return
     */
    @RequestMapping(value = "/hello2", method = RequestMethod.GET)
    public String hello2(String par1, Integer par2) {
        return "hello " + par1 + "," + par2;
    }

    /**
     * post 访问 传递表单数据
     *
     * @param par
     * @return
     */
    @RequestMapping(value = "/hello3", method = RequestMethod.POST)
    public String hello3(String par) {
        return "hello " + par;
    }

    /**
     * post 访问 参数放到请求体
     *
     * @param par
     * @return
     */
    @RequestMapping(value = "/hello4")
    public String hello4(@RequestBody String par) {
        return "hello " + par;
    }

    @RequestMapping(value = "/hello5")
    @ResponseBody
    public Person hello5(@RequestBody Person person) {
        return person;
    }
}

三、模型

package com.kyy.springboot.model;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @Auther:zhouhongliang
 * @Date:2019/7/31
 * @Description:
 */
public class Person implements Serializable{
    private Integer sid;
    private String name;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    private BigDecimal salary;
    private double bonus;

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public BigDecimal getSalary() {
        return salary;
    }

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }

    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
}

四、Mock方式单元测试

package com.kyy.springboot.controller;

import com.kyy.springboot.SpringBootDemo;
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.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
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 java.net.URI;

/**
 * @Auther:zhouhongliang
 * @Date:2019/7/31
 * @Description:
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootDemo.class)
@WebAppConfiguration
public class HelloControllerTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;

    @Before
    public void setupMockMvc() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get(new URI("/hello")))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }

    @Test
    public void testHello1() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/hello1/admin"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }

    @Test
    public void testHello2() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/hello2").param("par1", "admin").param("par2", "100"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }

    @Test
    public void testHello3() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/hello3").param("par", "admin"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }

    @Test
    public void testHello4() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/hello4")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content("par"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }

    @Test
    public void testHello5() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/hello5")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content("{\"sid\":1,\"name\":\"admin\",\"birthday\":\"1983-10-22\",\"salary\":\"1000\",\"bonus\":100}"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
    }
}

原文地址:https://blog.51cto.com/11147669/2425227

时间: 2024-10-08 18:22:00

SpringBoot单元测试之Mock方式的相关文章

单元测试之Mock

为什么需要Mock. 真实对象具有不确定的行为.所以会产生不可预测的结果. 真实对象很难被创建. 真实对象的某些行为很难被触发(如网络错误). 真实对象令程序的运行速度很慢. 真实对象有(或者是)用户界面. 测试需要询问真实对象它是如何被调用的. 真实对象实际上并不存在.例如其它小组开发的模块. 使用Mock的3个步骤 使用一个接口来描述该对象. 为产品代码实现该接口. 以测试为目的,在Mock对象中实现该接口. Test Double Dummy.被传递但是从不被实际使用的对象.通常用于填充参

补习系列-springboot 单元测试之道

目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 springboot 实现接口的测试 了解如何 利用 mokito 做代码的 mock 一.About 单元测试 单元测试其实是一种廉价的技术,是由开发者创建运行测试代码,用于对程序模块(软件设计的最小单位)进行正确性检验的一种做法. 而所谓的最小单元,就是指应用的最小可测试部件. 在面向对象领域,最小单

单元测试之Stub和Mock

单元测试之Stub和Mock FROM:http://www.cnblogs.com/TankXiao/archive/2012/03/06/2366073.html 在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,记录Log, 文件系统 之类的). 而我们没法控制这些外部依赖的对象.  为了解决这个问题,我们需要用到Stub和Mock来模拟这些外部依赖的对象,从而控制它们 阅读目录 实例 设计测试用例 什么是外部依赖 Stub和Mock的相同

单元测试之测试方法

单元测试面临的困难 职责不明确 类或者方法的职责不明确,违反了SRP原则. 类/方法如果处理了本不该它处理的逻辑,会造成单元测试需要关心过多的外部关联类. 静态方法 静态方法使得调用者直接面对实际的服务类,难以通过其它方式替代其实现,也难以扩展. 直接访问对象实例 调用者直接实例化服务对象,从而使用服务对象提供的服务.同静态方法一样,调用者直接面对服务类. 标准库 标准库中有非常多的接口调用使得调用者难以被测试. 准备数据 编写测试用例需要外部准备大量的数据. 可行的解决方案 重构系统 对于职责

玩转单元测试之Testing Spring MVC Controllers

玩转单元测试之 Testing Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311657.html The Spring MVC Test framework provides first class JUnit support for testing client and server-side Spring MVC code through a fluent API. Typically it loads t

玩转单元测试之WireMock -- Web服务模拟器

玩转单元测试之WireMock -- Web服务模拟器 WireMock 是一个灵活的库用于 Web 服务测试,和其他测试工具不同的是,WireMock 创建一个实际的 HTTP服务器来运行你的 Web 服务以方便测试. 它支持 HTTP 响应存根.请求验证.代理/拦截.记录和回放, 并且可以在单元测试下使用或者部署到测试环境. 它可以用在哪些场景下: 测试移动应用依赖于第三方REST APIs 创建快速原型的APIs 注入否则难于模拟第三方服务中的错误 任何单元测试的代码依赖于web服务的 目

单元测试之道(使用NUnit)

首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上的按钮,顿时你刚刚的轻松感烟消云散:系统无法正常工作,你想读的数据显示不出来,你想存的东西也送不到数据库……于是,你再次回 到IDE里,设断点.调试.一层一层跟踪,当你精疲力尽终于将数据送到数据库里,你又发现了其它问题,于是你继续设断点.调试.编译.调试…… 2.你狂躁地敲击着键盘和鼠标,咒骂着不断

单元测试之NSNull 检测

Unit Testing: 单元测试 测试这个词很容易理解,那么什么是单元(Unit)呢?一个单元指的就是应用程序中可以测试的最小单元.一组源代码可以测试,一般要求有明确的输入与输出.因此一般来说源代码中明确的包含输入输出的每一个方法被认为一个测试的单元(一个case).注意,这里的输出并不局限于方法的返回值对输入参数的改变,也包括方法在执行过程中改变的任何数据. 单元测试在程序里面可以理解一个模块一个方法,在每个可能存在的模块都进行测试,确保每个模块都没有问题,从而提高整体程序的质量. 单元测

.Net单元测试之NMock

.Net单元测试之NMock NMock是一款.NET平台下的基于动态代理的Mock模拟对象类库,用于C#开发.Mock对象使测试更简单,它测试单个组件或单个类时不需要其它所有组件真正实现.也就是说我们可以仅仅只是测试一个类,NMock生成的模拟是通过在运行时使用动态代理来实现的,这允许模拟对象动态的定义,并不需要添加任何附加的类.         通常,一个模拟的实现基于被依赖的接口而创建:NMock支持对接口和类的模拟,另外它还支持属性模拟.比起测试一个完整的对象关系树更容易查清楚Bug.M