Kotlin Mock Spring 启动测试无法编译

Posted

技术标签:

【中文标题】Kotlin Mock Spring 启动测试无法编译【英文标题】:Kotlin Mock Spring boot test can't compile 【发布时间】:2020-07-13 17:36:10 【问题描述】:

所以我有以下测试

@Test
    fun `when save claims is called with email saved to that profile` () 
        //arrange
        given(profileRepository.findProfileByEmail(anyString())).willAnswer  daoProfile 
        given(patientRepository.findById(anyInt())).willAnswer  Optional.of(daoPatient) 
        given(claimRepository.saveAll(anyList())).willAnswer  mutableListOf(daoClaim) 

        //act
        val result = claimService.saveClaimsForEmail(listOf(dtoClaim), "Test@test.test")

        //assert
        assert(result != null)
        assert(result?.isNotEmpty() ?: false)
        verify(claimRepository).saveAll(anyList())
     

given(claimRepository.saveAll(anyList())).willAnswer mutableListOf(daoClaim) 行给出以下错误

e: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtBlockExpression
File being compiled at position: (217,71) in /Users/archer/Work/masterhealth/master_billing/src/test/kotlin/com/masterhealthsoftware/master_billing/data/service/ClaimServiceTest.kt
The root cause java.lang.IllegalStateException was thrown at: org.jetbrains.kotlin.codegen.state.KotlinTypeMapper$typeMappingConfiguration$1.processErrorType(KotlinTypeMapper.kt:113)
...
Caused by: java.lang.IllegalStateException: Error type encountered: (???..???) (FlexibleTypeImpl).
        at org.jetbrains.kotlin.codegen.state.KotlinTypeMapper$typeMappingConfiguration$1.processErrorType(KotlinTypeMapper.kt:113)

删除该行后,它会编译,但由于显而易见的原因测试失败。

claimRespoitory 在测试类的顶部被注解为@MockBean,并且是一个JpaInterface。第 217 行是函数的开始。我也尝试过使用when 和其他各种 willReturn 或 willAnswer....

知道为什么吗?

【问题讨论】:

这看起来像一个 kotlin 编译器错误。您是否尝试过报告它和/或使用不同的编译器版本? 不,我没有,我今天会看一下。我以为我首先做错了什么。 你在使用最新的 kotlin 编译器吗? 我用 1.3.71 试过了 我开始认为这个问题来自于模拟 JpaRepository 方法。我正在尝试对 repository.findAll 进行模拟并得到相同的错误 【参考方案1】:

我在使用 Mockito any() 时遇到了同样的问题。将其更改为 ArgumentMatchers.any(YourClass::class.java)) 解决了编译错误,有一个已弃用的 ArgumentMatchers.anyListOf(YourClass::class.java) 可能会完成这项工作。

【讨论】:

所以它不是任何匹配器。 anyList() 工作正常。我刚刚从尝试模拟其他东西中发现,在模拟 JpaRepository 方法时很麻烦。我有一个 findAll() 我试图模拟并得到同样的错误 您能再解释一下吗?我在嘲笑findAll()findById(ArgumentMatchers.anyLong())findByLastName(ArgumentMatchers.anyStirng()) 和答案中提到的那个。使用JpaRepositoryReactiveCrudRepository 我没有收到任何编译错误。谢谢!

以上是关于Kotlin Mock Spring 启动测试无法编译的主要内容,如果未能解决你的问题,请参考以下文章

在Kotlin上怎样用Mockito2 mock final 类(KAD 23)

postman mock测试

高手都这么给 Spring MVC 做单元测试!

Spring学习12-Spring利用mock进行单元测试

Spring启动在集成测试中使用PowerMock模拟静态方法

如何在用 Kotlin 编写的 JUnit 5 测试类中注入 Spring bean?