`

基于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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics