У меня есть приложение весенней загрузки с kotlin, и дело в том, что я не могу издеваться над финальным классом третьей стороны, только когда используется @Retryable. Вот мой проект:
@Component
class RestClient {
fun getAllData() : List<String> = listOf("1")
}
@Service
class MyService(val restClient: RestClient) {
@Retryable(maxAttempts = 3)
fun makeRestCall() : List<String> {
return restClient.getAllData()
}
}
Итак, я хотел бы протестировать два случая:
- , когда
RestClient
выдает исключение HttpClientErrorException.NotFound, должно возвращаться makeRestCall()
null
(что не поддерживается текущей реализацией, это не имеет значения) - , когда вызывается
makeRestCall()
- я хотел бы проверить с помощью mockito, что он действительно вызывается (нет смысла, но почему может ' t Я делаю это?)
Вот мой тест:
@EnableRetry
@RunWith(SpringRunner::class)
class TTest {
@MockBean
lateinit var restClient: RestClient
@SpyBean
lateinit var myService: MyService
@Test
fun `should throw exception`() {
val notFoundException = mock<HttpClientErrorException.NotFound>()
whenever(restClient.getAllData()).thenThrow(notFoundException)
}
@Test
fun `method should be invoked`() {
myService.makeRestCall()
verify(myService).makeRestCall()
}
}
Чтобы смоделировать последний класс org.springframework.web.client.HttpClientErrorException.NotFound
, я добавил mockito-inline в качестве зависимости
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
Итак, вот проблема:
, когда я запускаю свои тесты с mockito-inline в качестве зависимости:
- test
should throw exception
- проходит - тест
method should be invoked
- завершается неудачей с исключением: Argument passed to verify() is of type MyService$$EnhancerBySpringCGLIB$$222fb0be and is not a mock!
при запуске моих тестов без mockito-inline в качестве зависимости:
- test
should throw exception
- сбои с исключением: Mockito cannot mock/spy because : final class
- метод `test` должен быть вызван - проходит
при запуске моих тестов без @ EnableRetry - оба теста пройдены, но я не могу проверить функциональность повторных попыток
Как с этим справиться?