编写不易,转载请注明( hhttp://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");
- }
- );
- }
- }