BBH
-Biz Branding Hub-
投稿日 : 
2020/04/02
更新日 : 
2020/04/02

SpringBoot + JUnit4でControllerのテストを行う

JUnitでコントローラーに対しリクエストを投げて結果をテストしたい時があるかと思います。
以下のように、MockMvcクラスを使用することでコントローラーのテストが可能です。
(JUnit4の記法です)

テスト対象のコントローラー

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @RequestMapping(method = RequestMethod.GET, value = "/"
    		        ,produces="text/plain;charset=UTF-8")
    @ResponseBody
	public String index() {
    	return "Test";
	}

}

テストクラス

import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)  // SpringBootアプリケーションのエントリポイントのクラス
public class TestControllerTest {

	// テスト対象のコントローラー
    @Autowired
    public TestController controller;

    public MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }

    @Test
    public void test() {

        try {
            MvcResult results = mockMvc.perform(
                                        get("/")
                                       .param("value1", "1")	// リクエストパラメータを追加できる
                                       .param("value2", "2")
                                       .param("value3", "3")
                                       .header("header key", "header value")  // ヘッダー情報を追加できる
                                       .characterEncoding("UTF-8")    // Controllerのレスポンスエンコーディングと合わせる必要がある
                                     )
            		                 .andDo(print())    // リクエスト情報をコンソールにprint
            		                 .andReturn();       // リクエスト結果を返却

            String res = results.getResponse().getContentAsString();
            assertEquals("Test", res);
        } catch (Exception e) {
        	e.printStackTrace();
            fail("リクエスト中にエラー発生");
        }
    }
}

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend