Проблема с сопоставлением аргументов Kotlin mockito

#kotlin #mockito #mockito-kotlin

#kotlin #mockito #mockito-kotlin

Вопрос:

Я пытаюсь проверить конкретный аргумент среди нескольких аргументов. Другие аргументы, которые я хотел бы проверить, носят простой характер. Но один аргумент я хотел бы использовать check {}, чтобы тщательно его проверить. Это завершается ошибкой. Я записал код и ошибку.

Тест:

 internal class UserInfoServiceTest: StringSpec() {
init {
    "should return userinfo from auth server" {
        val userInfo = UserInfo("Sethu", "pictureUrl")
        val restTemplate: RestTemplate = mock {
            on { exchange(
                    eq("authurl/userInfo"),
                    eq(HttpMethod.GET),
                    any(),
                    eq(UserInfo::class.java))
            } doReturn
                    ResponseEntity(UserInfo("Sethu", "pictureUrl"),
                                   HttpStatus.OK)
        }
        val userInfoService = UserInfoService(restTemplate, "authurl")

        val returnedUserInfo = userInfoService.getUserInfoFromAuth("accessToken")

        returnedUserInfo shouldBe userInfo

        verify(restTemplate).exchange(eq("authurl/userInfo"),
                eq(HttpMethod.GET),
                check<HttpEntity<Void>> {  httpEntity ->
                    httpEntity.headers.getValue("Authorization") shouldBe "Bearer accessToken"
                },
                eq(UserInfo::class.java))
    }
}
  

}

Тема:

 data class UserInfo(val name: String, val picture: String?)

@Service
class UserInfoService(val restTemplate: RestTemplate,
                  @Value(value = "${auth0.issuer}") val authServerUrl: String) {

fun getUserInfoFromAuth(accessToken: String): UserInfo {
    val headers = HttpHeaders()
    headers.set(HttpHeaders.AUTHORIZATION, "Bearer $accessToken")
    val request = HttpEntity<Void>(headers)
    val response = restTemplate.exchange("$authServerUrl/userInfo", HttpMethod.GET, request, UserInfo::class.java)
    return response.body!!
}
}
  

Ошибка:

 Argument(s) are different! Wanted:
restTemplate.exchange(
    "authurl/userInfo",
    GET,
    <custom argument matcher>,
    class csmart.api.user.UserInfo
);
-> at csmart.api.user.UserInfoServiceTest$1.invokeSuspend(UserInfoServiceTest.kt:29)
Actual invocation has different arguments:
restTemplate.exchange(
    "authurl/userInfo",
    GET,
    <[Authorization:"Bearer accessToken"]>,
    class csmart.api.user.UserInfo
);
-> at csmart.api.user.UserInfoService.getUserInfoFromAuth(UserInfoService.kt:21)
  

Комментарии:

1. Я перешел к использованию библиотеки mockk для редактирования в kotlin. Благодаря mockito он довольно надежный и более зрелый.