使用Retryable时,无法创建最终类的模拟

时间:2020-03-30 12:34:32

标签: spring unit-testing kotlin mocking spring-retry

我有一个带有kotlin的spring boot应用程序,问题是:仅当使用@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()时-我想通过嘲笑来检查它是否真的被调用(没有意义,但是为什么我不能这样做?)

这是我的考试:

@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,我添加了嘲笑内联作为依赖项

   <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-inline</artifactId>
      <version>3.1.0</version>
      <scope>test</scope>
   </dependency>

所以,这是问题所在:

当我运行测试时,以 mockito-inline 作为依赖项:

  • 测试should throw exception-通过
  • 测试method should be invoked-失败,并带有异常:Argument passed to verify() is of type MyService$$EnhancerBySpringCGLIB$$222fb0be and is not a mock!

当我运行测试时没有依赖模仿的内联

  • 测试should throw exception-失败,但异常:Mockito cannot mock/spy because : final class
  • 应调用“测试方法”-通过

当我在没有@EnableRetry 的情况下运行测试时-两个测试均通过,但是我无法测试重试功能

我该如何处理?

0 个答案:

没有答案