#17 [SpringBoot/KotlinでBFF]新規追加 POSTのUnitTest

Controller層

MockBeanアノテーションでService層をMock化した変数を用意
POSTの実行で指定するbodyデータをJacksonのObjectMapperでObject->JSON変換して作成
MockMvcクラスのインスタンスでPOSTを実行して結果をチェック

    @Autowired
    lateinit var mockMvc: MockMvc

    @Autowired
    lateinit var mapper: ObjectMapper

    @MockBean
    lateinit var mockTaskService: TaskService

    
    @Nested
    @DisplayName("createTask")
    inner class CreateTask {

        @DisplayName("should return task data with new taskId and default user when create task api is called.")
        @Test
        fun createTask() {
            given(mockTaskService.createTask(Task(taskId = null, title = "タスクのタイトル", description = "タスクの詳細説明", userName = null)))
                    .willReturn(Task(
                            12345,
                            "タスクのタイトル",
                            "タスクの詳細説明",
                            "unknown")
                    )

            val requestBody = Task(taskId = null, title = "タスクのタイトル", description = "タスクの詳細説明", userName = null)
            val requestBodyJson = mapper.writeValueAsString(requestBody);

            mockMvc.perform(
                    post("/tasks")
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(requestBodyJson))
                    .andExpect(status().isCreated)
                    .andExpect(jsonPath("taskId").value(12345))
                    .andExpect(jsonPath("title").value("タスクのタイトル"))
                    .andExpect(jsonPath("description").value("タスクの詳細説明"))
                    .andExpect(jsonPath("userName").value("unknown"))
        }
    }

Service層

MockitoでRepository層のMockを設定
テスト対象のfunctionを呼び出して結果をチェック

    @Autowired
    lateinit var taskService: TaskService

    @MockBean
    lateinit var mockTaskRepository: TaskRepository


    @Nested
    @DisplayName("createTask")
    inner class CreateTask {

        @DisplayName("should return task data with new taskId when createTask function is called.")
        @Test
        fun createTask() {
            given(mockTaskRepository.postTask(Task(title = "タスクのタイトル", description = "タスクの詳細説明")))
                    .willReturn(Task(
                            12345,
                            "タスクのタイトル",
                            "タスクの詳細説明",
                            Date())
                    )

            val actual = taskService.createTask(
                    com.example.bffsample.model.forfrontend.Task(
                            taskId = null,
                            title = "タスクのタイトル",
                            description = "タスクの詳細説明",
                            userName = ""))

            assertEquals(12345, actual.taskId)
            assertEquals("タスクのタイトル", actual.title)
            assertEquals("タスクの詳細説明", actual.description)
            assertEquals("unknown", actual.userName)
        }
    }

Repository層

MockRestServiceServerで外部APIをMock化してレスポンスを設定
外部APIからのレスポンスとしてここでもJacksonのObjectMapperを使用してJSON文字列を設定
テスト対象のfunctionを呼び出して結果をチェック

    @Autowired
    lateinit var taskRepository: TaskRepository

    @Autowired
    lateinit var objectMapper: ObjectMapper

    @Autowired
    lateinit var mockServer: MockRestServiceServer


    @Test
    @DisplayName("should return task data with taskId when taskRepository call to POST task to external Task-api.")
    fun postTask() {
        val task = Task(12345, "タスクのタイトル", "タスクの詳細説明", Date())
        this.mockServer.expect(requestTo("$taskApiUrl/tasks"))
                .andRespond(withSuccess(objectMapper.writeValueAsString(task), MediaType.APPLICATION_JSON))

        val actual: Task = taskRepository.postTask(
                Task(title = "タスクのタイトル", description = "タスクの詳細説明")) ?: Task()

        assertEquals(12345, actual.taskId)
        assertEquals("タスクのタイトル",
                actual.title)
        assertEquals("タスクの詳細説明", actual.description)
        assertNotNull(actual.created)
    }

コード

https://github.com/little-engineer/bff-sample/pull/21




ARでToDoを楽しく管理
iPhone用スマホアプリ
「Air ToDo」

空間上で楽しく管理するAR ToDoリストです。
チェックマークに3Dのパンダが使えるようになりました。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です