精华内容
下载资源
问答
  • 2021-11-20 21:17:34

    在UTDD的流程中,通常会从上到下进行模拟,流程如下:

    Controller接口单元测试
    –》Controller接口代码实现
    –》Api接口单元测试
    –》Api接口代码实现

    那么我们先从Controller的单元测试模拟开始:
    一、MockMvc功能介绍:
    MockMvc是由spring-test包提供,实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。

    接口MockMvcBuilder,提供一个唯一的build方法,用来构造MockMvc。
    主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装和集成Web环境测试(并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。
    MockMvcBuilders提供了对应的创建方法standaloneSetup方法和webAppContextSetup方法,在使用时直接调用即可。

    二、代码示例:
    首先是pom坐标:

    <?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.5.5</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>loan-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>loan-server</name>
        <description>loan-server</description>
        <properties>
            <java.version>1.8</java.version>
            <testcontainers.version>1.16.0</testcontainers.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.24</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter</artifactId>
                    </exclusion>
                </exclusions>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.jmockit/jmockit -->
            <dependency>
                <groupId>org.jmockit</groupId>
                <artifactId>jmockit</artifactId>
                <version>1.19</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.197</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.3.4</version>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.testcontainers</groupId>
                    <artifactId>testcontainers-bom</artifactId>
                    <version>${testcontainers.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    2.Controller接口测试类:

    @RunWith(SpringRunner.class)
    @AutoConfigureMockMvc
    @SpringBootTest(classes = LoanServerApplication.class)//这里放启动类
    public class LoanControllerTest {
    
        MockMvc mockMvc;
        @Autowired
        private WebApplicationContext webApplicationContext;
    
        @Before
        public void setUp() {
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
                    .addFilter(((request, response, chain) -> {
                        response.setCharacterEncoding("UTF-8");
                        chain.doFilter(request, response);
                    })).build();
        }
    
            @Test
        public void should_get_userLoanPlan_success_byGet() throws Exception {
            String result = mockMvc.perform(
                    get("/loan-plans/{idCard}", "412233333333"))
                    .andExpect(status().isOk())
                    .andReturn()
                    .getResponse()
                    .getContentAsString();
            String expected = "{\"createdAt\":\"2021-11-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-11-23T00:41:49.257512\"}";
            JSONComparator comparator = new CustomComparator(JSONCompareMode.LENIENT,
                    new Customization("id", (o1, o2) -> true),
                    new Customization("createdAt", (o1, o2) -> true),
                    new Customization("updatedAt", (o1, o2) -> true)
            );
            JSONAssert.assertEquals(expected, result, comparator);
        }
    
        @Test
        public void should_get_userLoanPlan_success_byPost() throws Exception {
            String result = mockMvc.perform(
                    post("/loan-plans/{idCard}", "412233333333"))
                    .andExpect(status().isOk())
                    .andReturn()
                    .getResponse()
                    .getContentAsString();
            String expected = "{\"createdAt\":\"2021-11-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-11-23T00:41:49.257512\"}";
            JSONComparator comparator = new CustomComparator(JSONCompareMode.LENIENT,
                    new Customization("id", (o1, o2) -> true),
                    new Customization("createdAt", (o1, o2) -> true),
                    new Customization("updatedAt", (o1, o2) -> true)
            );
            JSONAssert.assertEquals(expected, result, comparator);
        }
     }
    

    3、Controller接口代码

    @RestController
    @RequestMapping("loan-plans")
    public class LoanController {
        
    
        @GetMapping("/{idCard}")
        public JSONObject getUserLoadPlanMaterial(@PathVariable String idCard) {
            String result = "{\"createdAt\":\"2021-10-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-10-23T00:41:49.257512\"}";
    
            return JSONObject.parseObject(result);
        }
      
      @PostMapping("/{idCard}")
        public JSONObject Test(@PathVariable String idCard) {
            String result = "{\"createdAt\":\"2021-10-23T00:41:49.257479\",\"gender\":\"MALE\",\"houseMaterial\":{\"age\":0,\"price\":10000},\"id\":1,\"idCard\":\"412233333333\",\"income\":10000,\"lenderAge\":35,\"name\":\"王一\",\"togetherLender\":{\"idCard\":\"111111111\",\"income\":10000},\"updatedAt\":\"2021-10-23T00:41:49.257512\"}";
            return JSONObject.parseObject(result);
        }
     }
    

    这里我们通过MockMvc实现了一个简单的get/post请求接口的模拟及单元测试的编写~ 有兴趣的可以尝试一下~ 还可以拓展一些其他接口的单元测试~

    喜欢的朋友欢迎一键三连。我们一起学习,进步~~

    更多相关内容
  • 今天小编就为大家分享一篇关于SpringBoot Controller Post接口单元测试示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 主要介绍了Spring Boot从Controller层进行单元测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 在Spring Boot中实现单元测试同样非常方便,下面我们打开src/test/下的测试入口com.cloud.demo.DemoApplicationTests类,编写一个简单的单元测试来模拟HTTP请求,测试之前实现的/hello接口,该接口应返回Hello world...

    在Spring Boot中实现单元测试同样非常方便,下面我们打开src/test/下的测试入口com.cloud.demo.DemoApplicationTests类,编写一个简单的单元测试来模拟HTTP请求,测试之前实现的/hello接口,该接口应返回Hello world字符串。
    在这里插入图片描述

    具体代码实现如下所示。

    @SpringBootTest
    class DemoApplicationTests {
        private MockMvc mvc;
    
        @Before
        public void setUp() throws Exception {
            mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
            System.out.println("初始化mock模块");
        }
    
        @Test
        void hello() throws Exception {
            setUp();
            String responseString = mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())    //返回的状态是200
                    .andDo(print())         //打印出请求和相应的内容
                    .andReturn().getResponse().getContentAsString();   //将相应的数据转换为字符串;
            System.out.println("获取结果为:" + responseString);
    
        }
    }
    

    controller接口内容如下:

    @RestController
    public class HelloController {
        @RequestMapping(value = "/hello",method = RequestMethod.GET)
        public String inde(){
            return "Hello SpringCloud";
        }
    }
    

    测试结果如下:
    在这里插入图片描述

    展开全文
  • 单元测试调用Controller-Service层接口

    Contoller层接口:

    代码:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ControllerTest {
    
        @Autowired
        private UserController userController;
    
        @Test
        public void loginuser(){
            User user=new User();
            user.setUsername("jack");
            user.setPwd("1234");
            JsonData jsonData=userController.login(user);
            System.out.println(jsonData.toString());
            TestCase.assertEquals(0,jsonData.getCode());
        }
    }
    
    

    效果截图:
    1.输入错误密码
    在这里插入图片描述
    2.输入正确密码:
    在这里插入图片描述

    Service层接口:

    代码:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ServiceTest {
        @Autowired
        private VideoService videoService;
    
        @Test
        public void list(){
    
            List<Video> list=videoService.listVideo();
            System.out.println(list.toString());
            TestCase.assertTrue(list.size()>0);
        }
    }
    
    

    效果截图:
    在这里插入图片描述

    展开全文
  • 很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今天来演示下如果对Controller进行单元测试。以下内容默认您对单元测试...
  • 案例实战Controller层登陆方法测试 具体方法看不懂的小伙伴可看之前的get、post请求文章,这里只做具体调用讲解 @RunWith(SpringRunner.class) @SpringBootTest(classes={ProjectApplication.class}) public class ...

    案例实战Controller层登陆方法测试

    具体方法看不懂的小伙伴可看之前的get、post请求文章,这里只做具体调用讲解

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes={ProjectApplication.class})
    public class UserTest {
    
        //注入controller
        @Autowired
        private UserController userController;
    
        /**
         * 测试用户登陆接口
         */
        @Test
        public void loginTest(){
            User user = new User();
    
            user.setUsername("张三");
            user.setPwd("123");
            //调用controller层方法
            JsonData jsonData = userController.loginUser(user);
    
            System.out.println(jsonData.toString());
    
            //断言
            //判断状态码 预期是0返回正确
            TestCase.assertEquals(0,jsonData.getCode());
    
        }
    }
    

    案例实战 视频列表Service层的单元测试

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes={ProjectApplication.class})
    public class VideoTest {
    
        //注入视频接口
        @Autowired
        private VideoService videoService;
    
        @Before
        public void testOne(){
            System.out.println("这是个测试 before");
        }
    
        /**
         * 视频接口测试
         */
        @Test
        public void testVideoList(){
        //调用service层接口方法 返回集合对象
            List<Video> videoList = videoService.listVideo();
    
            //判断对象是否为空  预期是大于0
            TestCase.assertTrue(videoList.size()>0);
        }
    
        @After
        public void testThree(){
            System.out.println("这是个测试 after");
        }
    
    }
    

    使用IDEA快捷方式创建测试类

    无需手动去创建测试类方法,使用idea自带方式去new

    Step1:选择接口方法鼠标右键
    在这里插入图片描述
    在这里插入图片描述
    Step2:选择要测试的接口方法
    在这里插入图片描述
    这样在Test包下就自动生成了测试类了

    根据公司情况,写单元测试,核心接口一定要写,非核心的尽量写

    断言类型,可以细化,我这里只是判断了长度和非空,也可以判断结果为1或者2

    展开全文
  • 4.需要获得接口得返回值用以进行其他接口得关联: @Test public void createNewOrEditFile ( ) throws Exception { //创建文件夹 RequestBuilder request ; request = post ( "/api/v1/...
  • 单元测试接口测试的区别

    千次阅读 2019-06-20 20:33:40
    1、单元测试注重代码逻辑,接口测试注重业务逻辑; 2、单元测试的粒度最小,是测试最小独立的单元模块(不依赖其他模块);接口测试不是,会覆盖很多; 3、单元测试是白盒测试,接口测试是黑盒测试; 4、单元测试...
  • springboot对controller方法进行单元测试

    千次阅读 2022-01-08 17:12:48
    springboot对controller方法进行单元测试
  • 作为现在微服务开发基础的springboot,有必要针对这个框架的单元测试进行必要的探讨,尤其是controller接口单元测试。springboot针对单元测试提供了很多辅助注解,了解了这些注解就可以轻松的使用这些特性进行...
  • springboot增加接口单元测试 增加基类接口 SpringBootUnitTest @SpringBootTest @Transactional @Rollback @RunWith(SpringRunner.class) public class BaseUnitTest { @Autowired private ...
  • SpringBoot Controller Post接口单元测试

    万次阅读 2018-10-31 09:49:32
    而对于controller层,一般不怎么做单元测试,因为主要的核心业务逻辑都在service层里,controller层只是做转发,调用service层接口而已。但是还是建议使用单元测试简单的将controller的方法跑一下,看看转发和数据...
  • TestRestTemplate主要用于测试url请求后返回来的结果 RestTemplate 默认使用 jackson 完成 json 序列化和反序列化. 示例: 第一步:Maven依赖: <dependency> <groupId>org.springframework.boot</...
  • controller单元测试

    2021-11-09 11:19:57
    @Autowired WebApplicationContext webApplicationContext; private static final String baseUrl = "/user"; private MockMvc mvc; ... private RequestBuilder ... /**初始化测试环境*/ @BeforeEach public ..
  • 之前讲的是调用...如何测试Controller对外提供的接口 增加类注解 @AutoConfigureMockMvc 注入一个MockMvc类 相关API : perform执行一个RequestBuilder请求 andExpect:添加ResultMatcher->MockMvcResultMa
  • 下面介绍了get、post、put、delete四种请求方式 @Test public void testGetMethod() throws Exception { MvcResult result = mockMvc.perform(get("/face/match")) .andExpect(status().isOk())// 模拟...
  • Gradle单元测试

    千次阅读 2019-09-18 10:55:38
    Gradle单元测试 我们可以通过在Gradle添加Java插件来执行单元测试的任务,默认的,在项目中所有的测试都会被执行,如果我们只想测试其中一个类,我们可以使用Java系统属性test.single作为测试的名字,事实上,这个...
  • 通过java配置的方式搭建的一个基本的web项目,零xml配置,主要用于单元测试示例,使用了spring支持h2内存数据库,不需要额外安装数据库,可以测试controller层、service层,项目使用的打包工具为gradle,比maven配置...
  • SpringBoot 登录接口单元测试 1.针对登录接口获取Token package com.demo.test.controller; import com.alibaba.fastjson.JSONObject; import com.demo.test.Application; import com.demo.test.req.auth.LoginReq;...
  • 如何写一个最简单的Controller单元测试
  • SpringBoot快速建立单元测试(IDEA版本)

    千次阅读 2020-06-27 23:18:04
    此处单元测试只做一个简单的笔记指引,至于具体使用到的类或注解可以自己去拓展学习,水平有限,欢迎指教 一、业务层方法测试 第一步 :选中对应的类,建立单元测试方法 这里如果已经建立了测试类的测试方法,...
  • 通过构造函数进行依赖注入,避免了在代码中针对所依赖的接口创建相应的实例,这个改由IoC容器在运行时自动完成。我们主要在APS.NETMVC的Controller与应用层的服务实现中使用。比如下面的APS。NETMVCController示例...
  • 文章目录一、 单元测试的概念二、单元测试的作用三、Spring Boot引入的MockMvc的概念四、Service层的单元测试五、Controller层的单元测试六、断言的概念七、新断言assertThat使用八、Postman与Spring Boot 单元测试...
  • spring boot 单元测试调用controller接口

    千次阅读 2020-06-11 17:56:36
    import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest;...import org.springframework.test.context.junit4.Spri.
  • 单元测试对我们的代码质量非常重要。很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今...
  • 在近些天单元测试的过程中,遇到了各种需要使用Mock的情况,现总结记录。本文不对PowerMock和EasyMock进行讲解,因为我也不懂他俩的深层含义和区别。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,970
精华内容 15,188
关键字:

单元测试controller接口