0

我正在使用 ScalaMock3,我正在尝试javax.jms.TextMessage在我的 ScalaTest 规范中创建一个模拟。

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

在网上看,我发现了这个(未解决的)问题,但我希望有人至少可以建议一个解决方法......

谢谢

4

4 回答 4

1

基本上这是因为 Java 1.4 和 >= 1.5 版本之间的 API 差异。

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

当 ScalaMock 尝试创建此接口的模拟实例时,它会失败:

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

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

于 2016-04-01T14:38:11.940 回答
1

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

将此添加到您的代码中:

implicit val d = new Defaultable[java.util.Enumeration[_]] {
  override val default = null
}
于 2019-02-18T10:13:24.710 回答
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>并且编译器在此之后停止抱怨。

于 2016-10-14T14:24:37.310 回答
0

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

class TextMessageWrapper {
  lazy val textMessage: TextMessage = ???

  def getMessage() = textMessage.getMessage()
}

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

于 2016-08-01T16:34:25.567 回答