使用Spring Boot的MockMVC来测试控制器

使用MockMVC在JUnit中对使用Spring MVC创建的控制器进行测试。

MockMVC是什么

不需要部署到应用服务器即可实现Spring MVC的功能。使用MockMVC可以轻松创建控制器的测试。为了在Spring Boot中使用MockMVC,需要在build.gradle中添加以下描述。

testCompile('org.springframework.boot:spring-boot-starter-test')

在 SPRING INITIALIZR(https://start.spring.io/)上创建项目时,默认会在 build.gradle 文件中进行记录。

环境

为了尝试MockMVC,我使用SPRING INITIALIZR(https://start.spring.io/)创建了一个项目。
我设置了以下项目配置。除了添加Web和Thymeleaf依赖以使用Spring MVC和Thymeleaf之外,您可以随意选择其他的配置。

    • Spring Bootバージョン: 2.0M7

 

    • ビルドツール:Gradle

 

    • 言語:Kotlin

 

    dependency: Web, Thymeleaf

在这个环境下,我们将创建一个页面,其中包含两个文本框和一个注册按钮,以便我们可以输入用户名和电子邮件地址。

スクリーンショット 2017-12-28 17.43.49.png

使用MockMVC来测试通过浏览器访问根URL时是否显示输入页面。由于目的是尝试MockMVC,因此忽略页面显示外的其他处理。

创建控制器

创建一个控制器,用于显示index.html作为对根URL的GET请求的响应。

@Controller
class UserController {

    @RequestMapping(value = "/", method = [(RequestMethod.GET)])
    fun index(model: Model): String {
        model.addAttribute("userForm", UserForm())
        return "index"
    }
}    

创建一个表单类

我們將建立一個用於輸入表單的類。在 Kotlin 中,我們可以使用 data class 寫成簡潔的程式碼。

data class UserForm(val name: String = "", val mail: String = "")

创建视图

为了使用BootStrap,我在build.gradle中添加了以下内容。

compile group: 'org.webjars', name: 'bootstrap', version: '3.3.7-1'

使用Thymeleaf创建一个包含文本框和按钮的页面,如下所示。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>ユーザ登録</title>
</head>
<body>
    <div class="container">
        <h1>ユーザ登録</h1>
        <form id="userForm" method="post" th:action="@{/user}" th:object="${userForm}" action="/user">
            <div class="form-group">
                <label for="name">Name</label>
                <input class="form-control" id="name" type="text" th:feild="*{name}" name="name" placeholder="Name"/>
            </div>
            <div class="form-group">
                <label for="mail">Mail</label>
                <input class="form-control" id="mail" type="text" th:feild="*{mail}" name="mail" placeholder="Mail"/>
            </div>
            <button type="submit" class="btn btn-primary">登録</button>
        </form>
    </div>
</body>
</html>

创建考试

对于发送到根URL的GET请求所获得的响应进行以下内容的测试:
– 确保index.html作为视图被显示
– 确保状态码为200
– 确保文本框的name属性、placeholder属性和value属性的值是正确的

以下是创建测试类的方式。

@RunWith(SpringRunner::class) // ①
@WebMvcTest // ②
class UserControllerTest {

    @Autowired
    private lateinit var mockMvc: MockMvc  // ③

    @Test
    fun test1() {
        this.mockMvc.perform(get("/"))               // ④ 
                .andExpect(status().isOk)            // ⑤
                .andExpect(view().name("index"))     // ⑥
                .andExpect(xpath("/html/head/title").string("Title"))    // ⑦
                .andExpect(xpath("""//*[@id="name"]/@name""").string("name"))
                .andExpect(xpath("""//*[@id="name"]/@placeholder""").string("Name"))
                .andExpect(xpath("""//*[@id="name"]/@value""").string(""))
                .andExpect(xpath("""//*[@id="mail"]/@name""").string("mail"))
                .andExpect(xpath("""//*[@id="mail"]/@placeholder""").string("Mail"))
                .andExpect(xpath("""//*[@id="mail"]/@value""").string(""))
    }

}
    • ① JUnitでSpringのテストをするために使用します。

 

    • ② MockMVCを使用してビュー、コントローラをテストする場合は@WebMvcTestを使用します。

 

    • ③ MockMvcのインスタンスをDIします

 

    • ④ GETリクエストを送信します

 

    • ⑤ HTTPステータスをチェックします。

 

    • ⑥ ビューとしてindex.htmlが表示されていることをチェックします。

 

    ⑦ テキストボックスの各属性が正しいことをチェックします。XPathによってテキストボックスの属性値を取得できます

进行考试

您可以在IDE上将其用作JUnit测试运行。
如果要通过gradlew指定测试类,则应指定如下。

./gradlew test --tests "package.ControllerTest"
广告
将在 10 秒后关闭
bannerAds