ScalaMockを使ってハマった点を挙げておく

ScalaMock(https://scalamock.org/)は便利なモックライブラリです。数ヶ月前に自分のプロジェクトに導入したのですが、いくつか注意が必要な点があったので備忘録代わりに記事にします。
2021.06.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ScalaMockは便利なモックライブラリです。数ヶ月前に自分のプロジェクトに導入したのですが、いくつか注意が必要な点があったので備忘録代わりに記事にします。

scalatest/AsyncTestSuiteを使う場合はAsyncMockFactoryを使う

User Guideの「Integration with testing frameworks」 にも記載されているのですがAsyncTestSuite系のテストにはAsyncMockFactoryを使う必要があります。

When testing Futures with AsyncTestSuites (eg. AsyncFlatSpec), mix in org.scalamock.scalatest.AsyncMockFactory instead:

MockFactoryをmixinすると記述しているテストケースが全て無視されてしまいます。コンパイルエラーなどは特に起きないためテストクラスごとにテストを実行したり、テスト結果をよくみないと気付きにくいと思います。

関連Issue: https://github.com/paulbutcher/ScalaMock/issues/371

モック生成時にはコンストラクタが実行される

こちらはScalaMockがモック生成時に対象クラスのサブクラスを作成することによるものです。以下のようにコンストラクタでパラメータを参照する処理を呼んでいた場合NPEが発生します。

class MyClass(config: Config) {
    private val someNumber = config.getInt("some_number") //NPE
}

回避策

回避策としてはコンストラクタの当該引数を予め指定したサブクラスを作成して、そちらのモックを使用する方法があります。

(コンストラクタの処理が複雑な場合には難しい場合もあるかもしれませんが、その場合には一般的なプラクティスとしてコンストラクタではなくてファクトリメソッドを検討するべきです。)

class MyClassMock extends MyClass(new Config("some_number" -> 1)) //モック用のクラス
val myClassMock: MyClass = mock[MyClassMock]

関連Issue: https://github.com/paulbutcher/ScalaMock/issues/96

まとめ

ScalaMockを使ってハマった点について概要と回避策をまとめました。他にも見つけたら随時記事にしていきたいです。