ScalaMock 不会嘲笑我的短信



我正在使用ScalaMock3,并试图在我的ScalaTest规范中创建一个javax.jms.TextMessage的mock。

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] 
                      ^

在网上,我发现了这个(未解决的)问题,但我希望有人能建议至少。。。

感谢

发生这种情况的主要原因是Java1.4和>=1.5版本之间的API差异。

TextMessage使用Java 1.4非泛型类型java.util.Enumeration(继承自javax.jms.MessagegetPropertyNames的返回类型),而在较新的JVM中,java.util.Enumeration<E>是具有类型参数的泛型类。

当ScalaMock试图创建这个接口的模拟实例时,它在那里失败了:

null.asInstanceOf[java.util.Enumeration] 
Main.scala:46: trait Enumeration takes type parameters

不幸的是,我认为你无能为力。

ScalaMock有一个固定的问题:https://github.com/paulbutcher/ScalaMock/issues/29

将此添加到您的代码中:

implicit val d = new Defaultable[java.util.Enumeration[_]] {
  override val default = null
}

虽然这不是一个最佳解决方案,但将有问题的类嵌入到包装类中可以模拟测试套件中的行为。

class TextMessageWrapper {
  lazy val textMessage: TextMessage = ???
  def getMessage() = textMessage.getMessage()
}

然后,您可以在任何需要TextMessage实例的地方传递wrapper.textMessage

你试过这个吗?

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>得到这个错误时,我做了类似的事情,编译器在这之后停止了抱怨。

相关内容

  • 没有找到相关文章

最新更新