一応、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)
上記は、テストを実行するスレッド数なのですが、別スレッドでテストを行うと、オブジェクトを共有してしまうテストなどでは、上記要注意です。
テストなので、基本的にスレッド一つで回すので問題ないかと思います。