使用 spring-retry 进行 Spring Boot 测试

SpringBoot testing with spring-retry

我有以下功能(功能不是很重要):

    fun myRandomFunc(something: String?): List<Int> {
        return listOf(5)
    }

你可以想象它正在做一些 API 调用,返回一些对象的列表等。我可以像这样在测试中轻松地模拟这个函数:

        doReturn(
            listOf(
                5
            )
        )
            .whenever(...).myRandomFunc("something")

但是在我在混合中引入 (retry/recover) 之后,那个模拟现在正在抛出 org.mockito.exceptions.misusing.NotAMockException at ...。知道为什么吗?

这是 spring 重试的代码:

    @Retryable(
        value = [ApiException::class], maxAttempts = MAX_RETRIES,
        backoff = Backoff(delay = RETRY_DELAY, multiplier = RETRY_MULTIPLIER, random = true)
    )
    fun myRandomFunc(something: String?): List<Int> {
        return listOf(5)
    }

    @Recover
    fun testMyRandomFunc(exception: Exception): List<Int> {
        log.error("Exception occurred ...", exception)
        throw RemoteServiceNotAvailableException("Call failed after $MAX_RETRIES retries")
    }

代码有效,功能正常,只是测试的模拟现在被破坏了。希望得到一些帮助

Spring 重试围绕对象创建代理。

如果有接口,代理就是JDK代理;如果不是,则使用 CGLIB。

Mockito 无法模拟 CGLIB(最终)方法。