将Java Mockito测试转换为Kotlin
我在将以下工作将Java Mockito测试转换为Kotlin,java,kotlin,mockito,Java,Kotlin,Mockito,我在将以下工作Javatest转换为Kotlin @Test public void testSomething() { Mockito.when(parkIdMappingRepository.save(Mockito.any(ParkIdMapping.class))).thenAnswer( (Answer<ParkIdMapping>) invocation -> { ParkIdMapping mapping = in
Java
test转换为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());
@测试
公共空间{
Mockito.when(parkIdMappingRepository.save(Mockito.any(ParkIdMapping.class))。然后回答(
(答)调用->{
ParkIdMapping=invocation.getArgument(0);
映射。setId(100L);
回归映射;
}
);
ParkIdMapping mapping=parkIdMappingRepository.save(新的ParkIdMapping(“123”);
assertEquals(新的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)
}
@测试
公共娱乐测试\u correctParkIdMappingGeneration(){
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))。然后回答(
{invocation->//编译器错误
val mapping=invocation.getArgument(0)
mapping.id=100L
映射
}作为回答
)
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>
)
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))。然后回答(
{调用:调用锁->
val mapping=invocation.getArgument(0)作为ParkIdMapping
mapping.id=100L
映射
}作为回答
)
导致
java.lang.ClassCastException:com.foobar.parkidGenerationsServiceTest$test\u correctParkIdMappingGeneration$1无法强制转换为org.mockito.stubing.Answer
org.mockito.exceptions.misusing.unfinishedstubingexception:
此处检测到未完成的存根:
->在com.foobar.ParkIdGenerationServiceTest.testSomething(ParkIdGenerationServiceTest.kt:92)
最初的目的是修改传递到
存储库的save
方法的实体并将其返回。您知道怎么做吗?将unchecked cast移动到Answer
到getArgument
调用
此外,您还需要添加helper mock方法。Mockito.any()
在其验证函数中返回null,并且由于Kotlin null安全特性,mock会抛出NPE
像这样:
fun <T> any(): T {
Mockito.any<T>()
return uninitialized()
}
fun <T> uninitialized(): T = null as T
fun any():T{
Mockito.any()
返回未初始化()
}
fun uninitialized():T=null作为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)
}
@测试
公共娱乐测试\u correctParkIdMappingGeneration(){
Mockito.`when`(parkIdMappingRepository.save(any())。然后回答(
{invocation->//编译器错误
val mapping=invocation.getArgument(0)
mapping.id=100L
映射
}
)
val mapping=parkIdMappingRepository.save(ParkIdMapping(“123”))
assertEquals(100L,mapping.id)
}
关于Kotlin和Mockito interop的后续阅读:感谢您的快速响应。现在我在时(测试正文的第一行)出现了一个编译器错误,“类型推断失败。没有足够的信息在*fun when(methodCall:T!):ongoingstubing中推断参数T!请明确指定”我遗漏了什么吗?试着明确指定的参数when
:Mockito.`when`()
就像一个符咒。我可以随时更新您的代码片段并将您的答案标记为已解决。非常感谢。