RestTemplateのunitTestを作成して実行した時に以下のようなJSON parse errorが発生した場合の対応
org.springframework.web.client.RestClientException: Error while extracting response for type [class com.example.bffsample.model.externalapi.Task] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token 'Task': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Task': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (ByteArrayInputStream); line: 1, column: 6]
対応
WithSuccessで指定するMockのレスポンスが正しくなくて実行時にJSON parseエラーとなってたようなので、ObjectMapperを使用してJSON形式のStringをレスポンスとして返すように修正して解決。
修正前はObjectの内容をStringとして出力してしまっていた感じ。
修正前:Task(taskId=12345, title=タスクのタイトル, description=タスクの詳細説明, created=Tue Sep 22 12:49:27 JST 2020)
修正後:{“taskId”:12345,”title”:”タスクのタイトル”,”description”:”タスクの詳細説明”,”created”:”2020-09-22T03:49:27.768+00:00″}
AsIs
@RestClientTest(TaskRepository::class)
internal class TaskRepositoryTest {
@Autowired
lateinit var taskRepository: TaskRepository
@Autowired
lateinit var mockServer: MockRestServiceServer
@Test
fun getTask() {
mockServer.expect(requestTo("http://localhost:50000/tasks/12345"))
.andRespond(withSuccess(Task(
12345,
"タスクのタイトル",
"タスクの詳細説明",
Date()).toString(), MediaType.APPLICATION_JSON))
this.taskRepository.getTask(12345)
}
}
ToBe
@RestClientTest(TaskRepository::class)
internal class TaskRepositoryTest {
@Autowired
lateinit var taskRepository: TaskRepository
@Autowired
lateinit var mockServer: MockRestServiceServer
@Autowired
lateinit var objectMapper: ObjectMapper
@Test
fun getTask() {
val task = Task(
12345,
"タスクのタイトル",
"タスクの詳細説明",
Date())
mockServer.expect(requestTo("http://localhost:50000/tasks/12345"))
.andRespond(withSuccess(objectMapper.writeValueAsString(task), MediaType.APPLICATION_JSON))
this.taskRepository.getTask(12345)
}
}
コメントを残す