Screaming Loud

日々是精進

slickとspecs2を使った際のハマったエラー文

一応、slickとタイトルに書いてありますが、ハマったのは、specs2の仕様に対してです。

やってたこと

specs2を使い、Model周りのテスト。
該当クラス以外のメソッドに対しては、Mockを差し込んでテスト。

ハマったこと

その1

【謎のエラー】
[error]    InvalidUseOfMatchersException: :
[error] Invalid use of argument matchers!
[error] 2 matchers expected, 1 recorded:
[error] -> at org.specs2.mock.mockito.MockitoMatchers$class.any(MockitoMatchers.scala:24)
[error]
[error] This exception may occur if matchers are combined with raw values:
[error]     //incorrect:
[error]     someMethod(anyObject(), "raw String");
[error] When using matchers, all arguments have to be provided by matchers.
[error] For example:
[error]     //correct:
[error]     someMethod(anyObject(), eq("String by matcher"));
[error]
[error] For more info see javadoc for Matchers class.
【間違っていたところ】

差し込んだMockの引数に、any[]と定数と混ぜてしまっていた。

例えば、以下のようにreturnsを使って、返り値をMock化した際、
どこかにanyを使った際は、必ず全ての引数をanyにしなければいけません。

// 間違い
user.insert(any[Int],"taro")(any[RequestUser]) returns Option(453)

// 正しい
user.insert(any[Int],any[String])(any[RequestUser]) returns Option(453)

userはUserクラスのインスタンスです。

あとimplicitで渡しているものも全て渡さないといけません。
実際にコールしている部分では、implicitで見えていないので、忘れがちです。

その2

【発生していた問題】

テスト結果が、ころころ変わる

【解決策】

specsのclass内で以下を定義する

args.execute(threadsNb = 1)

上記は、テストを実行するスレッド数なのですが、別スレッドでテストを行うと、オブジェクトを共有してしまうテストなどでは、上記要注意です。

テストなので、基本的にスレッド一つで回すので問題ないかと思います。