Невозможно создать макет финального класса, когда используется Retryable - PullRequest
1 голос
/ 30 марта 2020

У меня есть приложение весенней загрузки с 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 - оба теста пройдены, но я не могу проверить функциональность повторных попыток

Как с этим справиться?

...