Wade Xu

-- 拓展测试的边界
posts - 25, comments - 199, trackbacks - 0, articles - 0

导航

公告

就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers

Posted on 2015-03-04 08:52 WadeXu 阅读(...) 评论(...) 编辑 收藏

就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers

转载注明出处:http://www.cnblogs.com/wade-xu/p/4311205.html 

 

接我前面一篇文章关于RestAssured测试Restful web service的, RestAssured还有一个功能, 使用RestAssuredMockMvc 单元测试你的Spring MVC Controllers, 这个MockMvc 是建立在Spring MockMvc基础上的, 其目的是让我们用起来更便捷。

 

Getting Ready

<dependency>
        <groupId>com.jayway.restassured</groupId>
        <artifactId>spring-mock-mvc</artifactId>
        <version>2.4.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    
    <!-- Optional -->
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-core</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-library</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>

 

Example

下面是我们要测试的Controller

package com.wadeshop.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class GreetingController {

    private static final String template = "Hello, %s!";

    @RequestMapping(value = "/greeting", method = RequestMethod.GET)
    @ResponseBody 
    public Greeting greeting(@RequestParam(value="name", required=false, defaultValue="World") String name) {
        return new Greeting(String.format(template, name));
    }
}

 

Greeting 类 如下

public class Greeting {
    
    private final String content;
    
    public String getContent() {
        return content;
    }
 
    public Greeting(String content) {
        this.content = content;
    }
    
}

 

##转载注明出处:http://www.cnblogs.com/wade-xu/p/4311205.html 

 

接下来就是创建Spring MVC 测试类了

package com.wadeshop.controller;

import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.given;
import static org.hamcrest.Matchers.equalTo;

import org.junit.Before;
import org.junit.Test;

import com.jayway.restassured.module.mockmvc.RestAssuredMockMvc;

public class GreetingControllerTest {

    @Before
    public void configured() {
        RestAssuredMockMvc.standaloneSetup(new GreetingController());
    }

    @Test
    public void test1() {
        given().
               param("name", "Johan").
         when().
               get("/greeting").
         then().
               statusCode(200).
               body("content", equalTo("Hello, Johan!"));
    }
    
    @Test
    public void test2() {
        given().
               param("name", "").
         when().
               get("/greeting").
         then().
               statusCode(200).
               body("content", equalTo("Hello, World!"));
    }

}

 

单元测试过程无非就这些步骤:

1. 准备测试环境, 上面的例子就是使用 standalone setup 初始化MockMvc, 传入被测Controller

2. 传入参数构造请求并且调用

3. 验证结果

 

执行结果如下

 

是不是很简单?

 

这种方式其实就是纯粹的单元测试,如果想模拟真实的Spring MVC, 走Spring MVC完整流程,比如Dispatcher servlet, 类型转换,数据绑定等等, 则需要用MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 我在以后的文章中会介绍到。

 

参考

https://code.google.com/p/rest-assured/wiki/Usage#Spring_Mock_Mvc_Module

 

##转载注明出处:http://www.cnblogs.com/wade-xu/p/4311205.html