Repository層に2つ目の外部API(ユーザー情報を取得)用のクラスを追加してController層で呼び出すまでを実装。複数の異なる外部APIを呼び出すのはService層でハンドリングするが良いけど、それは後からやるとして、ここではひとまずController層で呼び出してみる。
Model追加
import java.util.*
data class User (
val userId: Int? = null,
val userName: String? = null,
val created: Date? = null
)
Repositoryクラス追加
@Repository
class UserRepository(restTemplateBuilder: RestTemplateBuilder) {
private var restTemplate: RestTemplate? = null
init {
restTemplate = restTemplateBuilder.build()
}
fun getUser(userId: Int): User? {
val uri = "http://localhost:50001/users/$userId"
return restTemplate?.getForObject(uri, User::class)
}
}
RepositoryクラスのUnitテスト追加
@RestClientTest(UserRepository::class)
@DisplayName("UserRepository")
internal class UserRepositoryTest {
@Autowired
lateinit var userRepository: UserRepository
@Autowired
lateinit var mockServer: MockRestServiceServer
@Autowired
lateinit var objectMapper: ObjectMapper
@Nested
@DisplayName("getUser")
inner class GetTask {
@Test
@DisplayName("should return user data when userRepository call to GET user to external Task-api with user id.")
fun getUser() {
val user = User(1, "タスクの管理者A", Date())
mockServer.expect(MockRestRequestMatchers.requestTo("http://localhost:50001/users/1"))
.andRespond(MockRestResponseCreators.withSuccess(objectMapper.writeValueAsString(user), MediaType.APPLICATION_JSON))
val actual = userRepository.getUser(1) ?: User()
assertEquals(1, actual.userId)
assertEquals("タスクの管理者A", actual.userName)
assertNotNull(actual.created)
}
}
}
Controller層で呼び出す
@GetMapping("/{taskId}")
@ResponseBody
@ResponseStatus(HttpStatus.OK)
fun getTask(@PathVariable("taskId") taskId: Int): Task {
val task = taskRepository.getTask(taskId)
println(task)
val user = userRepository.getUser(1)
println(user)
return Task(
taskId = taskId,
title = "タスクのタイトル",
description = "タスクの詳細説明",
userName = "タスク担当者A")
}
}
実行結果
サービス、外部API用のサービスを起動して呼び出してみてる。
コンソールに取得結果が表示されているのを確認。
http://localhost:8080/tasks/12345
Task(taskId=12345, title=タスクのタイトル, description=タスクの詳細説明, created=Sun Sep 27 15:45:40 JST 2020)
User(userId=1, userName=タスクの管理者A, created=Sun Sep 27 15:45:40 JST 2020)
コメントを残す