UnityとMockライブラリ
モックライブラリを使うとテストが楽に書けるのでUnityでも使いたいです。しかしUnityで使うことを前提としたライブラリは見つけられませんでした。
なのでC#向けのライブラリを何とかして使うことになります。
Moq / NSubstitute / FakeItEasy
有名なのはMoq、NSubstitute、FakeItEasyだと思います。
どのライブラリもUnityのプロジェクトにdllを入れれば普通に使えます。Moqについては丁寧に説明してくれているページがあるのでそちらを見ながら出来ると思います。他も手順は似たようなものなので説明は省略します。
これらのライブラリの問題点として実行時にコード生成していることが挙げられます。つまりIL2CPPビルドで使えません。エディタ上だけで動かすテストコードなら大丈夫ですが実機上でも動かそうとすると困ります。
LightMock
実行時にコード生成しないモックライブラリを探してみるとLightMockを見つけました。これならIL2CPP環境でも動きます。
コード生成せずにどうするかと言うと、自前で必要なモッククラスを書きます。LightMock自体はモッククラスを書きやすくしてくれる機能を提供しているイメージです。結局1つ1つ自分で書く必要があるのでとても面倒です。
LightMock.Generator
これを自動生成してくれるライブラリとしてLightMock.Generatorがあります。こちらの自動生成は実行時ではなく、C#のSouceGeneratorを利用してコンパイル時に行われます。
しかしUnityはまだSouceGeneratorをサポートしていません。一応Unityの外部で動かしてファイルとして出力させれば使えない事もないです。詳しい方法はこちらのページで紹介されています。
LightMock.Generatorも頑張れば動きました。IL2CPPでテストが動くことも確認済みです。しかし実プロジェクトで使えるかというとかなり覚悟が必要です。上手く動かすにはディレクトリ構成などの運用をどうするかしっかり考える必要がありそうでした。
どうするべきか
現時点ではIL2CPPでMockライブラリを使うのは諦めるのがよさそうです。モックがたくさん必要になるユニットテストはEditModeテストにしてエディタ上だけで確認し、全体を組み合わせたテストだけをPlayModeテストにして実機でも確認する、といった運用になると思います。
そのうちUnityがSourceGeneratorに対応したらまた対応を考えます。LightMockに限らずSouceGeneratorを利用したモックライブラリはいくつかありました。Moqも次のメジャーアップデートでSourceGeneratorを使うと書いていました。
今はまだ時期尚早という感じです。SouceGeneratorがあれば色々と変わるのでUnityでも早くサポートしてほしいところです。