2017-05-17 3 views
2

私は私が(理由は値クラス消去の)私は理解していくつかの奇妙なエラーメッセージが表示され、取得していますが、私はMockitoにはない驚いて 値クラス(extends AnyVal)のインスタンスを返すメソッドを模擬しようとしていますそれに対処する。

私のクラス:

case class MyValueClass(value: String) extends AnyVal 

私はモックとしたい機能:

trait ToMock { 
    def something(someParams: String): MyValueClass 
} 

そしてモック:

val theMock = mock[ToMock] 
val returned = MyValueClass("test") 
when(theMock.something("test")).thenReturn(returned) 

このコードは、次のエラーが発生します。

MyValueClass cannot be returned by something() 
something() should return String 

しかし、私は、それは文字列を返すようならば、もちろん、それはもうコンパイルされません...

私はextends AnyValを削除する場合は、もちろん、それが正常に動作します。

+1

Mockitoは、あなたのScalaのタイプについて "郵便番号" を与えます。 javapを使って、バイトコードファイルの内容を最初にチェックすることによって、そのメソッドの* true *シグネチャを理解します。あなたのスカラー感覚が、Mockitoがその決定を下すために使用しているコンテンツと一致することを本当に確かめるために。 – GhostCat

+0

それは問題です:コンパイルするにはScalaにMyValueClassが必要ですが、値クラスであるためバイトコードで消去されるので、実行時にはmockitoはラップされた値(私の例ではString)を必要とします。私は回避策を探しているだけです。 – Guillaume

+0

は方法を見つけ、あなたが解決策を見つけたうれしい – Guillaume

答えて

1

OK、私は作品の答えを見つけました。 は、私はそれがタイプセーフではないので、それが動作doReturn

doReturn(returned.value).when(theMock).something("test") 

の古いmockitoスタイルを使用する必要があります。しかし 十分に満足できるものではない、私は型の安全性をあきらめるよう。