我在将以下工作 Java
测试转换为 Kotlin
@Test
public void testSomething() {
Mockito.when(parkIdMappingRepository.save(Mockito.any(ParkIdMapping.class))).thenAnswer(
(Answer<ParkIdMapping>) invocation -> {
ParkIdMapping mapping = invocation.getArgument(0);
mapping.setId(100L);
return mapping;
}
);
ParkIdMapping mapping = parkIdMappingRepository.save(new ParkIdMapping("123"));
assertEquals(new Long(100L), mapping.getId());
Intellij Idea 到 Kotlin 的转换结果:
@Test
public fun test_correctParkIdMappingGeneration() {
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))).thenAnswer(
{ invocation -> // compiler error
val mapping = invocation.getArgument(0)
mapping.id = 100L
mapping
} as Answer<ParkIdMapping>
)
val mapping = parkIdMappingRepository.save(ParkIdMapping("123"))
assertEquals(100L, mapping.id)
}
然而,带有 lambda 参数 'invocation' 的行会导致编译器错误:
Cannot infer a type for this parameter. Please specify it explicitly .
我试过像这样调整 lambda
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))).thenAnswer(
{ invocation: InvocationOnMock ->
val mapping = invocation.getArgument(0) as ParkIdMapping
mapping.id = 100L
mapping
} as Answer<ParkIdMapping>
)
导致
java.lang.ClassCastException: com.foobar.ParkIdGenerationServiceTest$test_correctParkIdMappingGeneration$1 cannot be cast to org.mockito.stubbing.Answer
org.mockito.exceptions.misusing.UnfinishedStubbingException: Unfinished stubbing detected here: -> at com.foobar.ParkIdGenerationServiceTest.testSomething(ParkIdGenerationServiceTest.kt:92)
初衷是修改传递给repository
的save
方法的实体并返回。有什么想法该怎么做?
最佳答案
将未检查的转换移动到 Answer<ParkIdMapping>
至 getArgument
称呼。
此外,您还需要添加 helper mock 方法。 Mockito.any()
由于 Kotlin 的 Null 安全特性,在它的验证函数中返回 null 并且模拟抛出 NPE。
像这样:
fun <T> any(): T {
Mockito.any<T>()
return uninitialized()
}
fun <T> uninitialized(): T = null as T
测试将是:
@Test
public fun test_correctParkIdMappingGeneration() {
Mockito.`when`<ParkIdMapping>(parkIdMappingRepository.save(any())).thenAnswer(
{ invocation -> // compiler error
val mapping = invocation.getArgument<ParkIdMapping>(0)
mapping.id = 100L
mapping
}
)
val mapping = parkIdMappingRepository.save(ParkIdMapping("123"))
assertEquals(100L, mapping.id)
}
关于 Kotlin 和 Mockito 互操作的 future 阅读:https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791
关于java - 将 Java Mockito 测试转换为 Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52421802/