我正在使用ScalaMock3,并试图在我的ScalaTest规范中创建一个模拟的javax.jms.TextMessage。
import javax.jms.TextMessage
import org.scalamock.scalatest.MockFactory
import org.scalatest.{Matchers, WordSpecLike}
class MySpec extends WordSpecLike
with Matchers
with MockFactory {
"MySpec" should {
"create the mock I want!" in {
val msg = mock[TextMessage]
msg.getText _ expects() returning "my_text"
msg.getText shouldBe "my_text"
}
}
}然而,当我尝试编译时,我得到了以下结果:
[error] /my/path/MySpec.scala:14: could not find implicit value for evidence parameter of type org.scalamock.util.Defaultable[java.util.Enumeration]
[error] val msg = mock[TextMessage]
^在网上寻找,我找到了这个(未解决的) issue,但我希望有人能至少建议一个解决办法……
谢谢
发布于 2016-04-01 22:38:12
基本上,这是由于Java1.4和Java1.5版本之间的>=差异造成的。
TextMessage使用Java1.4非泛型类型java.util.Enumeration (从getPropertyNames返回从javax.jms.Message继承的类型),而在较新的JVM中,java.util.Enumeration<E>是带有类型参数的泛型类。
当ScalaMock尝试创建此接口的模拟实例时,它在以下位置失败:
null.asInstanceOf[java.util.Enumeration]
Main.scala:46: trait Enumeration takes type parameters不幸的是,我不认为你能做太多。
发布于 2019-02-18 18:13:25
ScalaMock有一个已修复的问题:https://github.com/paulbutcher/ScalaMock/issues/29
将以下代码添加到您的代码中:
implicit val d = new Defaultable[java.util.Enumeration[_]] {
override val default = null
}发布于 2016-08-02 00:34:26
虽然这不是一个最佳的解决方案,但将有问题的类嵌入到包装器类中可以模拟测试套件中的行为。
class TextMessageWrapper {
lazy val textMessage: TextMessage = ???
def getMessage() = textMessage.getMessage()
}然后,您可以在需要TextMessage实例的任何地方传递wrapper.textMessage
https://stackoverflow.com/questions/36337415
复制相似问题