読者です 読者をやめる 読者になる 読者になる

seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

ScalaTest 1.9.1 の MockitoSugar は使うべきでない

Scala で直接 Mockito を使おうとしたこんなコードで

import org.scalatest._
import mock.MockitoSugar
import org.mockito.Mockito._

class SomeSpec extends FlatSpec with MockitoSugar {

  it should "judge a valid session" in {
    val req = mock[HttpServletRequest]
    val session = mock[HttpSession]
    when(req.getSession).thenReturn(session)
    when(session.getAttribute("user_id")).thenReturn("found")
    // 以下省略
  }

}

オーバーロードの問題で、以下のようなコンパイルエラーになります。

ambiguous reference to overloaded definition,
both method thenReturn in trait OngoingStubbing of type (x$1: Object, x$2: <repeated...>[Object])org.mockito.stubbing.OngoingStubbing[Object]
and  method thenReturn in trait OngoingStubbing of type (x$1: Object)org.mockito.stubbing.OngoingStubbing[Object]
match argument types (String)
    when(session.getAttribute("user_id")).thenReturn("found")
                                                          ^

ここにあるように

http://stackoverflow.com/questions/2159248/spurious-ambiguous-reference-error-in-scala-2-7-7-compiler-interpreter/2159352#2159352

こんな感じのコードに書き換えるとうまくいきますが

when(session.getAttribute("user_id")).thenReturn("found", Array[Object](): _*)

他に方法あるのでしょうか。そもそも「Mockito を直接使うのは諦めろ」かもしれないけど。

(追記)

と思ったら、これは MockitoSugar のせいでした。これは少なくとも 1.9.1 時点では使ってはいけないものですね。classOf を書く手間を惜しむなということで。 MockitoSugar の mixin をやめて、以下のようにコードを書き換えるだけで、問題なく Mockito を使えます。

val req = mock(classOf[HttpServletRequest])