2017-05-17 46 views
2

我试图嘲笑一种方法,返回一个值类的实例(extends AnyVal) 我收到了一些奇怪的错误消息,我明白(因为值类删除),但我很惊讶Mockito没有应付那个。如何模拟一个返回值为Mockito的类实例的函数?

我的类:

case class MyValueClass(value: String) extends AnyVal 

我想嘲笑功能:

trait ToMock { 
    def something(someParams: String): MyValueClass 
} 

而且模拟:

val theMock = mock[ToMock] 
val returned = MyValueClass("test") 
when(theMock.something("test")).thenReturn(returned) 

此代码生成以下错误:

MyValueClass cannot be returned by something() 
something() should return String 

不过,当然,如果我做它返回一个字符串,它不会再编译...

如果我删除extends AnyVal,当然它工作正常。

+1

Mockito给出关于您的Scala类型的“zip”。我会通过首先检查字节码文件中的内容来使用javap来理解该方法的* true *签名。要确定你的scala-perception符合Mockito用于做出决定的内容。 – GhostCat

+0

这就是问题:编译Scala需要MyValueClass,但当然是因为它是一个值类,它在字节码上被擦除,所以在运行时,mockito需要包装值(在我的例子中是一个String)。我只是在寻找解决方法。 – Guillaume

+0

找到了方法,看到我的回答如下 – Guillaume

回答

1

好的,我找到了一个有效的答案。 我需要使用的doReturn

doReturn(returned.value).when(theMock).something("test") 

旧风格的Mockito,因为它不是类型安全的,它的工作原理。 虽然不完全令人满意,但我放弃了类型安全。

相关问题