基于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.     }  

猜你喜欢

转载自m635674608.iteye.com/blog/2383985