Я пытаюсь шпионить за restTemplate и хочу заглушить метод «exchange».
Вот код:
шпионский класс
@Bean
fun mockedRestTemplate(): RestTemplate = Mockito.spy(RestTemplate::class.java)
другой класс
val headers = HttpHeaders()
headers.setBasicAuth(UUID.randomUUID().toString(), UUID.randomUUID().toString())
val responseBody = "some error message"
val ex = HttpClientErrorException.create(
HttpStatus.NOT_FOUND,
"random",
headers,
responseBody.toByteArray(),
Charset.defaultCharset()
)
val httpEntity = HttpEntity(Any(), headers)
Mockito.doThrow(ex).`when`(restTemplate).exchange(
any() ?: config.randomEndpoint,
any(HttpMethod::class.java) ?: HttpMethod.POST,
any() ?: httpEntity,
any() ?: Foo::class.java
)
Что я могу делать неправильно здесь? Я получаю это сообщение об ошибке:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at test.suites.controller.FooTest.canGetFailedErrorFieldsIfApiRejectsRequest(FooTest.kt:468)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
Когда я издеваюсь/шпионю за другими классами, все работает нормально
Сопоставители, такие как any(), должны использоваться только в вызовах verify(). У тебя есть:
val httpEntity = HttpEntity(Any(), headers)
Вы не можете использовать any() в этом контексте, поскольку вы создаете объект, а не проверяете вызов метода. Вам нужно передать фактическое значение здесь.
Примечание: spy() предназначен для обертывания реального экземпляра. Если вы просто издеваетесь над интерфейсом (RestTemplate), вам, скорее всего, следует использовать вместо него mock(RestTemplate::class.java).
Я нашел проблему, но так и не понял причину. Проблема была в config.randomEndpoint. Когда я изменил значение на строковый тип без внедрения класса конфигурации, ошибка исчезла.
Да, я знаю, но это не решает проблему. Я хотел обернуть реальный экземпляр, поэтому я мог издеваться только над некоторыми определенными методами.