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

使用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"