【发布时间】:2018-09-20 09:28:08
【问题描述】:
我在将以下工作 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”的行会导致编译器错误:
无法推断此参数的类型。请明确说明。
我试着像这样调整 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 无法转换为 org.mockito.stubbing.Answer
org.mockito.exceptions.misusing.UnfinishedStubbingException: 此处检测到未完成的存根: -> 在 com.foobar.ParkIdGenerationServiceTest.testSomething(ParkIdGenerationServiceTest.kt:92)
本意是修改传递给repository的save方法的实体并返回。任何想法该怎么做?
【问题讨论】: