今回の記事はSpringBootでテストを行う方法を初心者向けに紹介する記事です。テストクラスを使ってテストを行ったことがない方など用の記事となっております。参画するプロジェクトでテストを行う必要がある方などは是非参考にしてみてください。
SpringBootプロジェクト構成
今回テストを行う場所はControllerクラスのルーティング部分のみとします。Controllerクラスで指定のURLに対してget通信が行われた場合に正しい応答が帰ってきているかに関してテストを行います。
下記記事はSpringBootとMybatisを使ってSpringBootのWebアプリを作成する手順です。
「SpringBoot+Mybatisを使ってDBからデータ取得とデータ表示を行う方法。」
この記事より必要なクラスのみを実装し、テストクラスを作成していきます。
ディレクトリ構成
ディレクトリ構成は下記のようになっています。まずはクラスを追加して下記構成を作成するところまで行いましょう。特に触っていないフォルダは省略しています。
.
├── build.gradle
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── example
│ │ ├── Main.java
│ │ ├── controller
│ │ │ └── UserController.java
│ └── resources
│ └── templates
│ └── index.html
では次に必要なモジュールをインストールしていきます。
build.gradle追加
build.Gradleは下記のように修正してください。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok:1.18.8'
annotationProcessor 'org.projectlombok:lombok:1.18.8'
implementation 'org.springframework.boot:spring-boot-starter-tomcat'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
ではいよいよSpringBootプロジェクトを起動させていきます。
SpringBootプロジェクト作成
Controller作成
package org.example.controller;
import org.example.dto.UserSearchRequest;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
// コントローラー
@Controller
public class UserController {
// サービス
@Autowired
UserService userService;
// ルーティング
@GetMapping(value = "/user/search")
public String displaySearch(Model model) {
return "index";
}
}
HTML作成
では最後にHTMLです。初期表示時にはフォーム情報がからであり、かつ初期表示で登録されているデータ全件を表示するようにしています。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>ユーザー情報検索</title>
<meta charset="utf-8" />
</head>
<body>
<h1>ユーザー情報検索</h1>
<form th:action="@{/user/id_search}" th:object="${userSearchRequest}" th:method="post">
<div>
ID:<input type="text" th:field="*{id}" />
</div>
<br />
<div>
<input type="submit" value="検索" />
</div>
<br />
</form>
</body>
</html>
こちらでSpringBootのプロジェクトが動くことを確認できると思います。
「http://localhost:8080/user/search」
上記にアクセスできれば問題ないです。
では次にこの通信が挙動かをテストするテストクラスを作成していきます。
SpringBootにテストクラスの作成
まずはプロジェクト内に自動で作られているテストフォルダの中にテストクラスを作成します。
適当な名前のファイルを作成します。
import org.example.controller.UserController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class SampleTest {
@Autowired
private MockMvc mockMvc;
@BeforeEach
void setup() {
// Spring MVCのモックを設定する
this.mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
void getTest() throws Exception {
// GETで「/」にアクセスする
mockMvc.perform(MockMvcRequestBuilders.get("/user/search"))
// レスポンスのステータスコードが200であることを検証する
.andExpect(status().isOk());
}
}
上記の解説を行います。
まず、コントローラーのMockとして下記にControllerを持ちます。
@Autowired
private MockMvc mockMvc;
@BeforeEach
void setup() {
// Spring MVCのモックを設定する
this.mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
そして、このオブジェクトに対して、下記のようにテスト用のメソッドを作成します。
@Test
void getTest() throws Exception {
// GETで「/」にアクセスする
mockMvc.perform(MockMvcRequestBuilders.get("/user/search"))
// レスポンスのステータスコードが200であることを検証する
.andExpect(status().isOk());
}
「@Test」がテスト用のメソッドと認識し、「.get(“/〇〇/△△”))」で後ろのURLに対してget通信が行われているかのテストを「.andExpect(status().isOk())」でサーバからのレスポンスが正しいものかをテストしております。
テストクラスのメソッドを実行する際は下記のようにメソッドの横に実行ボタンがあります。
実行すると下記のように成功かどうかが表示できます。
クラス単位でテストを実行できるので、クラス内にメソッドを追加して様々なテストを一括して行うことも可能です。
では今回の記事は以上です。他にもSpringBoot関連の記事を記載しているので、興味あればサイト内みて行ってください。
コメント