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)
}
コメントを残す