我正在使用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,但我希望有人能建议至少解决这个问题......
由于
答案 0 :(得分:1)
基本上这是因为Java 1.4和> = 1.5版本之间存在API差异。
TextMessage
使用Java 1.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
我不认为你可以做很多事情。
答案 1 :(得分:1)
ScalaMock有一个已解决的问题:https://github.com/paulbutcher/ScalaMock/issues/29
将此添加到您的代码中:
implicit val d = new Defaultable[java.util.Enumeration[_]] {
override val default = null
}
答案 2 :(得分:0)
虽然它不是最佳解决方案,但将有问题的类嵌入到包装类中可以模拟测试套件中的行为。
class TextMessageWrapper {
lazy val textMessage: TextMessage = ???
def getMessage() = textMessage.getMessage()
}
然后,您可以在需要wrapper.textMessage
的实例的任何地方传递TextMessage
答案 3 :(得分:0)
你试过这个吗?
implicit object DefaultableEnumeration extends Defaultable[java.util.Enumeration[Object]] {
val default = new java.util.Enumeration[Object] {
override def hasMoreElements: Boolean = false
override def nextElement: Object = throw new NoSuchElementException("no elements")
}
当我使用java.util.List<T>
收到此错误时,我做了类似的事情,编译器在此之后停止了抱怨。