Controller層
MockBeanアノテーションでService層をMock化した変数を用意
Delete成功時はレスポンスデータが無いのでMockから何も返却しないようにwill{}を使用
MockMvcクラスのインスタンスでDELETEを実行してHttpStatusがNoContentになっている事とレスポンスbodyが空である事をチェック
@Autowired
lateinit var mockMvc: MockMvc
@Autowired
lateinit var mapper: ObjectMapper
@MockBean
lateinit var mockTaskService: TaskService
@Nested
@DisplayName("deleteTask")
inner class DeleteTask {
@DisplayName("should return HttpStatus 204 with no body when delete task api is called for existing item.")
@Test
fun deleteTask() {
given(mockTaskService.deleteTask(12345)).will { }
mockMvc.perform(delete("/tasks/12345"))
.andExpect(status().isNoContent)
.andExpect(content().string(""))
}
}
Service層
MockitoでRepository層のMockを設定
テスト対象のfunctionを呼び出して結果をチェック
戻り値がUnit(Void)である事を確認
@Autowired
lateinit var taskService: TaskService
@MockBean
lateinit var mockTaskRepository: TaskRepository
@Nested
@DisplayName("deleteTask")
inner class DeleteTask {
@DisplayName("should return no data when deleteTask function is called with task id.")
@Test
fun getTask() {
given(mockTaskRepository.deleteTask(12345)).will { }
val actual = taskService.deleteTask(12345)
assertEquals(Unit, actual)
}
}
Repository層
MockRestServiceServerで外部APIをMock化してレスポンスを設定。HttpStatus204が返ってくるように設定する。
テスト対象のfunctionを呼び出して結果をチェック
@Autowired
lateinit var taskRepository: TaskRepository
@Autowired
lateinit var objectMapper: ObjectMapper
@Autowired
lateinit var mockServer: MockRestServiceServer
@Test
@DisplayName("should be deleted and return no data when taskRepository call to DELETE task to external Task-api.")
fun deleteTask() {
this.mockServer.expect(requestTo("$taskApiUrl/tasks/12345"))
.andRespond(withStatus(HttpStatus.NO_CONTENT))
val actual = taskRepository.deleteTask(12345)
assertEquals(Unit, actual)
}
コメントを残す