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