`

基于Mockito 的Spring Controller 单元测试

    博客分类:
  • Test
阅读更多

编写不易,转载请注明( http://shihlei.iteye.com/blog/2383971)!

 

一 概述:

 

实现spring rest controller 单元测试,依赖service mock,用于重点测试controller的行为 

 

二 maven 依赖

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>x.test</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>test</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.12</junit.version>
        <mockito.version>2.8.47</mockito.version>
        <powermock.version>1.7.0</powermock.version>
        <assertj.version>3.8.0</assertj.version>

        <servlet-api.version>3.1.0</servlet-api.version>
        <spring.version>4.3.4.RELEASE</spring.version>
    </properties>

    <dependencies>
        <!-- test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>${powermock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>${assertj.version}</version>
            <scope>test</scope>
        </dependency>


        <!--web -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet-api.version}</version>
        </dependency>
        <!-- mvc -->
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- utils -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>

    </build>
</project>

 

三样例

1)待测试controller 及依赖的service

package x.test.adv.service;

import x.test.adv.dao.pojo.User;

/**
 * 用户服务
 * <p>
 * Created by shilei on 2017/7/10.
 */
public interface UserService {

    /**
     * 保存 , 如果保存成功,记录日志
     *
     * @param user user
     */
    void save(User user);
}

/**
 * 用户
 * <p>
 * Created by shilei on 2017/7/10.
 */
public class User {

}

 

package x.test.adv.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import x.test.adv.dao.pojo.User;
import x.test.adv.service.UserService;

/**
 * user controller
 * <p>
 * Created by shilei on 2017/7/10.
 */
@RestController
@RequestMapping("/user/v1")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/{id}", method = RequestMethod.POST)
    public String save(@ModelAttribute User user) {
        try {
            userService.save(user);
            return "success";
        } catch (Exception e) {
            return "error : " + e;
        }
    }
}

 

2)单测程序

package x.test.adv.controller;

import org.assertj.core.api.Assertions;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.context.ContextConfiguration;
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.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import x.test.adv.service.UserService;

/**
 * rest test
 * Created by shilei on 2017/7/10.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
public class UserControllerTest {

    private MockMvc mockMvc;

    @Mock
    private UserService userService;

    @InjectMocks
    private UserController userController;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
    }

    @Test
    public void test_UserController_save_return_success() throws Exception {
        //mock 行为
        Mockito.doNothing().when(userService).save(Mockito.any());

        //构建请求
        RequestBuilder request = MockMvcRequestBuilders.post("/user/v1/1");

        //断言结果
        mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("success"));
    }

    @Test
    public void test_UserController_save_return_start_error() throws Exception {
        //mock 行为 模拟错误路径查看返回
        Mockito.doThrow(new IllegalArgumentException("user error !")).when(userService).save(Mockito.any());

        //构建请求
        RequestBuilder request = MockMvcRequestBuilders.post("/user/v1/2");

        //断言结果
        mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(
                        result -> {
                            Assertions.assertThat(result.getResponse().getContentAsString()).startsWith("error");
                        }
                );
    }
}

 

 

0
1
分享到:
评论

相关推荐

    spring集成TestNG与Mockito框架单元测试方法.pdf

    接下来,文档给出了不同测试类的参考示例,例如TestNGDemo、MockitoDemo、Controller单元测试类、Service服务单元测试类以及Dubbo服务单元测试类。通过查看这些示例代码,开发者可以了解如何在实际项目中编写各种...

    spring MVC junit 单元测试(controller)

    在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...

    07. Spring Boot单元测试

    在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的正确性和可靠性。Spring Boot提供了方便的工具和库,使得编写和执行单元测试变得简单高效。本章节我们将深入探讨Spring Boot中的...

    spring mvc的简单单元测试

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、可扩展的...总之,通过正确使用JUnit、Mockito、Spring Test以及MockMVC,我们可以编写出全面、有效的Spring MVC单元测试,确保代码质量并降低潜在的bug。

    类似Spring Controller 注解Demo

    在实际开发中,我们应该编写单元测试和集成测试来确保Controller的正确性。JUnit和Mockito等工具可以帮助我们进行测试。 总的来说,"类似Spring Controller注解Demo"是一个关于如何在Spring MVC中使用Controller...

    spring单元测试

    在本文中,我们将深入探讨如何使用Spring框架进行单元测试,特别是在一个基于Java配置的Web项目中。我们将重点关注如何集成H2内存数据库以简化测试过程,以及如何针对Controller层和服务层进行有效的测试。 首先,...

    Spring Boot中的单元测试.pdf

    在Spring Boot中,单元测试是确保代码质量和可维护性的重要组成部分。通过单元测试,开发者能够独立验证代码的各个部分,确保它们按照预期工作,并在修改代码后快速发现潜在问题。Spring Boot为此提供了一系列便利...

    Struts2SpringUnitDemo单元测试

    在单元测试中,Spring的Mockito库可以用来模拟协作对象,以便隔离被测试的代码。 3. **单元测试**:单元测试是软件开发过程中的重要环节,它验证单个代码单元(如方法或类)的功能是否符合预期。JUnit是Java中最...

    SpringBoot 多模块Dao层单元测试

    在Java和Spring Boot环境中,我们可以使用JUnit框架来进行单元测试,同时结合Mockito等工具来模拟对象行为,以便专注于测试目标方法。 对于多模块的Spring Boot项目,每个模块可能包含不同的组件,如Service层、...

    SpringBoot 多模块 Serivce 层单元测试

    总结来说,Spring Boot多模块项目中Service层的单元测试是一个系统的过程,涉及到测试环境搭建、测试类编写、模拟对象的使用以及断言和覆盖率的检查。通过有效的单元测试,我们可以保证Service层的业务逻辑正确,...

    Spring对于业务层的单元测试支持

    此外,Spring的Mockito集成允许我们创建mock对象,模拟协作对象的行为,避免了因依赖过多而导致的复杂测试场景。`@MockBean`可以在测试上下文中替换真实bean,而`@SpyBean`则可以在原有bean基础上创建一个spy,部分...

    Spring Boot中的单元测试.docx

    本文将详细介绍如何在Spring Boot项目中实现基于Service和Controller层的单元测试。 #### 二、Spring Boot中的单元测试框架 在Spring Boot中进行单元测试通常依赖于一系列的测试框架和工具,包括但不限于JUnit、...

    spring+jpa+全局异常+单元测试

    对于Spring和JPA的应用,我们可以使用JUnit和Mockito进行单元测试。JUnit是Java的单元测试框架,Mockito则用于模拟协作对象,使得测试更加隔离。Spring Boot提供了一个测试框架,允许我们轻松地创建和配置测试环境,...

    基于Spring4MVC的测试Demo

    我们还可以使用JUnit进行单元测试,测试单个类或方法的功能,以及Mockito等库来模拟协作对象,确保测试的隔离性。对于集成测试,Spring Boot的TestRestTemplate或WebTestClient可以用来发送HTTP请求并验证响应。 总...

    单元测试案例junit +spring mvc +springboot

    JUnit作为Java领域最流行的单元测试框架,与Spring MVC和Spring Boot的集成使得开发者能够更高效地进行测试驱动开发(TDD)或行为驱动开发(BDD)。下面将详细介绍这个主题中的相关知识点。 1. JUnit JUnit是一个...

    spring-unit-tests:Spring Boot +单元测试+ Mockito + MVC-用于控制器和服务层

    在这个项目"spring-unit-tests"中,我们将探讨如何在Spring Boot应用中结合Mockito进行单元测试,特别是针对控制器和服务层。 首先,让我们了解Spring Boot。它是一个基于Spring框架的轻量级脚手架,旨在简化新...

    spring-boot-test示例程序

    综上所述,"spring-boot-test"示例程序涵盖了Spring Boot中测试的核心概念,包括Rest Controller的集成测试、单元测试的策略以及测试工具的使用,这些都是保证软件质量和可维护性的重要组成部分。通过学习和实践这些...

    SpringTest_springtest_spring_java_Framework_

    对于测试部分,可以学习如何使用Mockito进行单元测试,以及如何利用Spring Boot Test的特性进行集成测试,比如模拟HTTP请求和数据库操作。 总的来说,SpringTest项目为我们提供了一个学习和实践Spring框架的起点,...

    SSM整合实现分页以及单元测试代码

    对于SSM整合项目,我们可以使用JUnit作为测试框架,Mockito进行模拟对象测试,PowerMock进行静态方法和私有方法的测试。测试主要包括对Service层和Mapper层的测试,确保业务逻辑和数据库操作的正确性。 6. **...

Global site tag (gtag.js) - Google Analytics