#19 [SpringBoot/KotlinでBFF]更新 PUTのUnitTest

Controller層

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

    @Autowired
    lateinit var mockMvc: MockMvc

    @Autowired
    lateinit var mapper: ObjectMapper

    @MockBean
    lateinit var mockTaskService: TaskService

    
    @Nested
    @DisplayName("updateTask")
    inner class UpdateTask {

        @DisplayName("should return task data when update task api is called for existing item.")
        @Test
        fun updateTask() {
            given(mockTaskService.updateTask(12345, Task(taskId = null, title = "タスクのタイトル", description = "タスクの詳細説明", userName = null)))
                    .willReturn(Task(
                            12345,
                            "タスクのタイトル",
                            "タスクの詳細説明",
                            "タスク担当者A")
                    )

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

            mockMvc.perform(
                    put("/tasks/12345")
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(requestBodyJson))
                    .andExpect(status().isOk)
                    .andExpect(jsonPath("taskId").value(12345))
                    .andExpect(jsonPath("title").value("タスクのタイトル"))
                    .andExpect(jsonPath("description").value("タスクの詳細説明"))
                    .andExpect(jsonPath("userName").value("タスク担当者A"))
        }
    }

Service層

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

    @Autowired
    lateinit var taskService: TaskService

    @MockBean
    lateinit var mockTaskRepository: TaskRepository

    @MockBean
    lateinit var mockUserRepository: UserRepository

    @Nested
    @DisplayName("updateTask")
    inner class UpdateTask {

        @DisplayName("should be updated and return task data when updateTask function is called.")
        @Test
        fun updateTask() {
            given(mockTaskRepository.putTask(12345, Task(title = "タスクのタイトル", description = "タスクの詳細説明")))
                    .willReturn(Task(
                            12345,
                            "タスクのタイトル",
                            "タスクの詳細説明",
                            Date())
                    )

            given(mockUserRepository.getUser(12345))
                    .willReturn(User(
                            12345,
                            "タスクの担当者A",
                            Date())
                    )

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

            assertEquals(12345, actual.taskId)
            assertEquals("タスクのタイトル", actual.title)
            assertEquals("タスクの詳細説明", actual.description)
            assertEquals("タスクの担当者A", 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 be updated and return updated data when taskRepository call to PUT task to external Task-api.")
    fun putTask() {
        val task = Task(12345, "タスクのタイトル", "タスクの詳細説明", Date())
        this.mockServer.expect(requestTo("$taskApiUrl/tasks/12345"))
                .andRespond(withSuccess(objectMapper.writeValueAsString(task), MediaType.APPLICATION_JSON))

        val actual: Task = taskRepository.putTask(
                12345, 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/23




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

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




コメントを残す

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