LoginSignup
0
0

KotlinとJUNIT4でControllerテストを作成

Posted at

環境

言語:Kotlin(フレームワーク:spring)
テストフレームワーク:JUNIT4
モックフレームワーク:mockito

テスト対象のControllerクラス

今回は、【項番・動物名・画像】のデータを出力する画面を考える。
下記コントローラではサービスから受け取ったデータとともに画面を返却しています。

例:動物一覧画面用コントローラ
package jp.com.***zoo.controller.animal.animalList.view

import jp.com.***zoo.service.animal.animalList.AnimalListService
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping

/**
 * 動物一覧画面用Controllerクラス
 */
@Controller
class AnimalListController(private val animalListService: AnimalListService) {
    /**
     * 動物一覧画面用画面を表示
     * @param model: 画面用オブジェクト
     * @return 動物名一覧画面
     */
    @GetMapping("/animal/animal_list/")
    fun init(model: Model): String {
        // 動物リストをモデルに詰める
        model.addAttribute("animalListViewDto", animalListService.getAnimalList())

        // Viewを返却
        return "animal/animalList/animal_list"
    }
}

Controllerテストクラス

package jp.com.zoo.controller.animal.animalList.view

import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.mock

import jp.com.zoo.dto.AnimalDto

import jp.com.zoo.controller.animal.animalList.view.dto.animalListViewDto
import jp.com.zoo.service.animal.animalList.animalListService
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.test.context.ActiveProfiles
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.ResultActionsDsl
import org.springframework.test.web.servlet.get
import org.springframework.test.web.servlet.setup.MockMvcBuilders

// 設定ファイルの読み込み(この場合 application-test.properties が読み込まれる)
@ActiveProfiles(value = ["test"]) 
class AnimalListControllerTest {
    // コントローラクラスの動作検証を可能にする
    private lateinit var mockMvc: MockMvc

    // MockMvcのリクエスト結果に対し、期待値Actionを適用できる
    private lateinit var result: ResultActionsDsl

    // Serviceクラスのモック化
    // private val animalListService: AnimalListService = mock() でも良い
    private val animalListService = mock<AnimalListService>()

    // テスト対象のControllerクラス
    private val controller = AnimalListController(
        animalListService
    )

    @BeforeEach
    fun setUp() {
        // MockMVCのインスタンス生成
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build()
    }

    @Nested
    @DisplayName("init")
    inner class Test01 {

        @Nested
        @DisplayName("正常系")
        inner class Test0101 {
            // 期待値テンプレート
            private val expectedTemplate = AnimalListViewDto(
                mWorkplaceList = mutableListOf(
                    AnimalDto(
                        id = 1,
                        name = "ライオン",
                        image = "/image/animal/lion.png",
                    ),
                    AnimalDto(
                        id = 2,
                        name = "ゾウ",
                        image = "/image/animal/elephant.png",
                    ),
                    AnimalDto(
                        id = 3,
                        name = "パンダ",
                        image = "/image/animal/panda.png",
                    ),
                )
            )

            @Test
            @DisplayName("動物リストを取得できること")
            fun test01() {
                // 期待値
                val expected = expectedTemplate.copy()

                // モック化したServiceメソッド呼び出し
                doReturn(expected).`when`(animalListService).getAnimalList()

                // Controllerの呼び出し
                result = mockMvc.get("/anmal/animal_list/")
                result.andExpect {
                    status { isOk() }
                    view { name("animal/animalList/animal_list") }
                    model { attribute("animalListViewDto", expected) }
                }
            }
        }
    }
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0