2016-03-31 4 views
0

Я использую ScalaMock3, и я пытаюсь создать макет javax.jms.TextMessage в моей спецификации ScalaTest.ScalaMock не издевается над моим 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, но я надеялся, что кто-то может предложить работу вокруг в как минимум ...

Благодаря

ответ

1

в основном это происходит из-за различий между API Java 1.4 и> = 1.5 версии.

TextMessage использует Java 1.4 неуниверсальный тип java.util.Enumeration (тип возвращаемого из getPropertyNames унаследованного от javax.jms.Message), тогда как в более новых виртуальных машинах java.util.Enumeration<E> является общим классом с параметром типа.

Когда ScalaMock пытается создать высмеивал экземпляр этого интерфейса, он не существует:

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

Я не думаю, что есть много вы можете сделать, к сожалению.

0

Хотя это не оптимальное решение, внедрение класса-нарушителя в класс-оболочку позволяет насмехаться над поведением в вашем тестовом наборе.

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

    def getMessage() = textMessage.getMessage() 
} 

Затем можно передать wrapper.textMessage везде экземпляр TextMessage требуется

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> и компилятор перестал жаловаться после этого.

Смежные вопросы