つかびーの技術日記

情報系修士卒のWeb系技術日記です。現在のフォーカス分野はアドテクです。

specs2+mockitoで引数あり関数のstub(mock)を作成する方法まとめ

   

前回の記事でspecs2とmockitoでmockを作ってテストする方法を解説しました。

specs2のmock機能(stub機能)とtrait+overrideを使ってテスタビリティを上げる

前回の記事を読むだけである程度テストを書けるようになると思いますが、今回はもう少し解説して行きます。

今回はmockを作る部分のみ解説しますので、より実践的なテストコードを書く方法については前回の記事を参照してください。

引数あり関数のmock

any***を使えばOKです。

例えば

というようにすればOKです。引数がある場合は上記のようにanyIntなどを使います。

勿論実際に呼び出されるときの引数を固定したり、引数の値によって挙動を変えたい場合はanyIntなどではなく、実際の値を使います。

AnyValでない引数ありの関数のmock

上記の場合はanyIntを使いましたが、引数が独自クラスなどの場合はanyを使います。

簡単ですね。

関数にimplicit parameterがある場合は要注意

以下のような感じの関数があるとします。

こういう関数でもmockの作り方は変わらないのですが・・・implicit parameterの存在を忘れていると悲惨なことになります。(自分はこのせいで2時間くらいハマってました・・・)

では早速「ダメな例」を書いてみます。

これはコンパイル成功しますが、実行時にエラーが出ます。

以下がエラー文です。

anyObject()とかはMockito(Java)のメソッドです。さっぱり意味が分からないしanyの使い方もあってるのに、という感じですが・・・。

これはどういうことかというと、implicit parameter部分のanyが抜けているから発生しています。という訳で、m.getString(any)としている部分をm.getString(any)(any)とすると正しく動きます。

「成功例」

 まとめ

  • 引数ありの場合はanyIntやanyを使う
  • 独自クラスでもanyを使えばOK
  • implicit parameterの存在を忘れると変なエラーが実行時に出る

実は機能的にはまだまだ大量にあって、ここまででmockの全体の10%程度しか解説していません。詳しくは公式をご覧下さい。

http://etorreborre.github.io/specs2/guide/org.specs2.guide.Matchers.html

 

 - Scala, ライブラリ , ,