我有一个带有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 的情况下运行测试时-两个测试均通过,但是我无法测试重试功能
我该如何处理?