`
m635674608
  • 浏览: 5061495 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

基于Mockito 的Spring Controller 单元测试

 
阅读更多

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

一 概述:

 

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

 

二 maven 依赖

Xml代码  收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.   
  5.     <groupId>x.test</groupId>  
  6.     <artifactId>test</artifactId>  
  7.     <version>1.0-SNAPSHOT</version>  
  8.     <packaging>jar</packaging>  
  9.   
  10.     <name>test</name>  
  11.     <url>http://maven.apache.org</url>  
  12.   
  13.     <properties>  
  14.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  15.         <junit.version>4.12</junit.version>  
  16.         <mockito.version>2.8.47</mockito.version>  
  17.         <powermock.version>1.7.0</powermock.version>  
  18.         <assertj.version>3.8.0</assertj.version>  
  19.   
  20.         <servlet-api.version>3.1.0</servlet-api.version>  
  21.         <spring.version>4.3.4.RELEASE</spring.version>  
  22.     </properties>  
  23.   
  24.     <dependencies>  
  25.         <!-- test -->  
  26.         <dependency>  
  27.             <groupId>junit</groupId>  
  28.             <artifactId>junit</artifactId>  
  29.             <version>${junit.version}</version>  
  30.             <scope>test</scope>  
  31.         </dependency>  
  32.         <dependency>  
  33.             <groupId>org.mockito</groupId>  
  34.             <artifactId>mockito-core</artifactId>  
  35.             <version>${mockito.version}</version>  
  36.             <scope>test</scope>  
  37.         </dependency>  
  38.         <dependency>  
  39.             <groupId>org.powermock</groupId>  
  40.             <artifactId>powermock-module-junit4</artifactId>  
  41.             <version>${powermock.version}</version>  
  42.             <scope>test</scope>  
  43.         </dependency>  
  44.         <dependency>  
  45.             <groupId>org.powermock</groupId>  
  46.             <artifactId>powermock-api-mockito2</artifactId>  
  47.             <version>${powermock.version}</version>  
  48.             <scope>test</scope>  
  49.         </dependency>  
  50.         <dependency>  
  51.             <groupId>org.assertj</groupId>  
  52.             <artifactId>assertj-core</artifactId>  
  53.             <version>${assertj.version}</version>  
  54.             <scope>test</scope>  
  55.         </dependency>  
  56.   
  57.   
  58.         <!--web -->  
  59.         <dependency>  
  60.             <groupId>javax.servlet</groupId>  
  61.             <artifactId>javax.servlet-api</artifactId>  
  62.             <version>${servlet-api.version}</version>  
  63.         </dependency>  
  64.         <!-- mvc -->  
  65.         <!-- spring -->  
  66.         <dependency>  
  67.             <groupId>org.springframework</groupId>  
  68.             <artifactId>spring-context</artifactId>  
  69.             <version>${spring.version}</version>  
  70.         </dependency>  
  71.         <dependency>  
  72.             <groupId>org.springframework</groupId>  
  73.             <artifactId>spring-web</artifactId>  
  74.             <version>${spring.version}</version>  
  75.         </dependency>  
  76.         <dependency>  
  77.             <groupId>org.springframework</groupId>  
  78.             <artifactId>spring-webmvc</artifactId>  
  79.             <version>${spring.version}</version>  
  80.         </dependency>  
  81.         <dependency>  
  82.             <groupId>org.springframework</groupId>  
  83.             <artifactId>spring-test</artifactId>  
  84.             <version>${spring.version}</version>  
  85.             <scope>test</scope>  
  86.         </dependency>  
  87.         <dependency>  
  88.             <groupId>org.springframework</groupId>  
  89.             <artifactId>spring-context-support</artifactId>  
  90.             <version>${spring.version}</version>  
  91.         </dependency>  
  92.   
  93.         <!-- utils -->  
  94.         <dependency>  
  95.             <groupId>com.google.guava</groupId>  
  96.             <artifactId>guava</artifactId>  
  97.             <version>20.0</version>  
  98.         </dependency>  
  99.     </dependencies>  
  100.     <build>  
  101.         <plugins>  
  102.             <plugin>  
  103.                 <groupId>org.apache.maven.plugins</groupId>  
  104.                 <artifactId>maven-compiler-plugin</artifactId>  
  105.                 <configuration>  
  106.                     <source>1.8</source>  
  107.                     <target>1.8</target>  
  108.                 </configuration>  
  109.             </plugin>  
  110.         </plugins>  
  111.   
  112.     </build>  
  113. </project>  

 

三样例

 

1)待测试controller 及依赖的service

Java代码  收藏代码
  1. package x.test.adv.service;  
  2.   
  3. import x.test.adv.dao.pojo.User;  
  4.   
  5. /** 
  6.  * 用户服务 
  7.  * <p> 
  8.  * Created by shilei on 2017/7/10. 
  9.  */  
  10. public interface UserService {  
  11.   
  12.     /** 
  13.      * 保存 , 如果保存成功,记录日志 
  14.      * 
  15.      * @param user user 
  16.      */  
  17.     void save(User user);  
  18. }  
  19.   
  20. /** 
  21.  * 用户 
  22.  * <p> 
  23.  * Created by shilei on 2017/7/10. 
  24.  */  
  25. public class User {  
  26.   
  27. }  

 

Java代码  收藏代码
  1. package x.test.adv.controller;  
  2.   
  3.   
  4. import org.springframework.beans.factory.annotation.Autowired;  
  5. import org.springframework.web.bind.annotation.ModelAttribute;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7. import org.springframework.web.bind.annotation.RequestMethod;  
  8. import org.springframework.web.bind.annotation.RestController;  
  9. import x.test.adv.dao.pojo.User;  
  10. import x.test.adv.service.UserService;  
  11.   
  12. /** 
  13.  * user controller 
  14.  * <p> 
  15.  * Created by shilei on 2017/7/10. 
  16.  */  
  17. @RestController  
  18. @RequestMapping("/user/v1")  
  19. public class UserController {  
  20.   
  21.     @Autowired  
  22.     private UserService userService;  
  23.   
  24.     @RequestMapping(value = "/{id}", method = RequestMethod.POST)  
  25.     public String save(@ModelAttribute User user) {  
  26.         try {  
  27.             userService.save(user);  
  28.             return "success";  
  29.         } catch (Exception e) {  
  30.             return "error : " + e;  
  31.         }  
  32.     }  
  33. }  

 

2)单测程序

Java代码  收藏代码
  1. package x.test.adv.controller;  
  2.   
  3. import org.assertj.core.api.Assertions;  
  4. import org.junit.Before;  
  5. import org.junit.Test;  
  6. import org.junit.runner.RunWith;  
  7. import org.mockito.InjectMocks;  
  8. import org.mockito.Mock;  
  9. import org.mockito.Mockito;  
  10. import org.mockito.MockitoAnnotations;  
  11. import org.springframework.mock.web.MockServletContext;  
  12. import org.springframework.test.context.ContextConfiguration;  
  13. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  14. import org.springframework.test.context.web.WebAppConfiguration;  
  15. import org.springframework.test.web.servlet.MockMvc;  
  16. import org.springframework.test.web.servlet.RequestBuilder;  
  17. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;  
  18. import org.springframework.test.web.servlet.result.MockMvcResultMatchers;  
  19. import org.springframework.test.web.servlet.setup.MockMvcBuilders;  
  20. import x.test.adv.service.UserService;  
  21.   
  22. /** 
  23.  * rest test 
  24.  * Created by shilei on 2017/7/10. 
  25.  */  
  26. @RunWith(SpringJUnit4ClassRunner.class)  
  27. @ContextConfiguration(classes = MockServletContext.class)  
  28. @WebAppConfiguration  
  29. public class UserControllerTest {  
  30.   
  31.     private MockMvc mockMvc;  
  32.   
  33.     @Mock  
  34.     private UserService userService;  
  35.   
  36.     @InjectMocks  
  37.     private UserController userController;  
  38.   
  39.     @Before  
  40.     public void setUp() throws Exception {  
  41.         MockitoAnnotations.initMocks(this);  
  42.         this.mockMvc = MockMvcBuilders.standaloneSetup(userController).build();  
  43.     }  
  44.   
  45.     @Test  
  46.     public void test_UserController_save_return_success() throws Exception {  
  47.         //mock 行为  
  48.         Mockito.doNothing().when(userService).save(Mockito.any());  
  49.   
  50.         //构建请求  
  51.         RequestBuilder request = MockMvcRequestBuilders.post("/user/v1/1");  
  52.   
  53.         //断言结果  
  54.         mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk())  
  55.                 .andExpect(MockMvcResultMatchers.content().string("success"));  
  56.     }  
  57.   
  58.     @Test  
  59.     public void test_UserController_save_return_start_error() throws Exception {  
  60.         //mock 行为 模拟错误路径查看返回  
  61.         Mockito.doThrow(new IllegalArgumentException("user error !")).when(userService).save(Mockito.any());  
  62.   
  63.         //构建请求  
  64.         RequestBuilder request = MockMvcRequestBuilders.post("/user/v1/2");  
  65.   
  66.         //断言结果  
  67.         mockMvc.perform(request).andExpect(MockMvcResultMatchers.status().isOk())  
  68.                 .andExpect(  
  69.                         result -> {  
  70.                             Assertions.assertThat(result.getResponse().getContentAsString()).startsWith("error");  
  71.                         }  
  72.                 );  
  73.     }  

分享到:
评论

相关推荐

    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