前へ前回までは単体テストとは何か、必要性、そしてテストフレームワークについて書きました。今回はクラス間の依存に対して、どういうふうに単体テストを行うことについて説明していきたいと思います。我々が知っている通り、システム作りにおいてクラス同士の依存は避けられません。}}では、このAクラスに対して単体テストするときに、Bクラスも一緒にテストする必要があるか?答えはYesでもありNoでもあります。我々はクラスBの実行結果をテストする必要ありませんしかし、我々はこのクラスAの実行結果が絶対に正しいことを担保しなければいけませんそして、このコードはクラス間が密結合であるため、そもそもクラスAに対して単体テストできません。説明する前に、密結合と疎結合を説明しなければなりません。密結合とは、システムの構成要素間の結びつきや互いの依存関係、関連性などが強く、各々の独立性が低い状態のこと。さっきの例でいうとクラスAの中で直接クラスBのインスタンスを生成したことが密結合に繋がります。逆に、疎結合とは要素間の結びつきが弱く独立性が高い状態のことを指します。クラスAはクラスBを呼び出して処理するときは直接インスタンス生成するのではなく、インタフェースを介します。コードを見ながらリファクタリングしていきましょう。※ちなみにコードはサラで書いていますので、細かいミスがあれば大目に見てくださいwwまずはクラスBのインタフェースを定義します。そのインタフェースをクラスBに実装します。}}ここで依存性注入の登場です。クラスAではコンストラクタからの依存性注入することによって、インタフェースを介してBclassを呼び出します。デフォルト依存性注入をサポートしています。この一連のリファクタリングを通してクラスAとクラスBが疎結合になったところで、クラスAに対して単体テストを行います。FakeオブジェクトクラスAの単体テストを行うため、FakeオブジェクトのクラスBを用意する必要あります。Fakeオブジェクトにはstubとmockの2つの定義があります。stubstubとはSUTの要求に対して、あらかじめ用意した答えを返すオブジェクトのことを言います。コード書きながらstubについて理解していきましょう。}}このようにstubを利用して、クラスBを意識しなくてもクラスAの実行結果が正しいことを担保できます。stubの特徴をまとめると手動でコーディングしなければならない処理の細かい動作を把握しないと、適切なstubオブジェクトが書けません手動でコーディングしているので、テストケースの失敗する可能性が低いmockmockもstubと同じく偽物のオブジェクトですが、手動でコーディングするのではなく、mockフレームワークによって自動生成されます。.NETで有名なmockフレームワークはMoq,NSubstituteなどいろいろありますが、今回はNSubstituteを用いて実装していきたいと思います。}}stubと比べmockは自分でいちからコーディングする必要ありませんので、手軽にFakeオブジェクトを作れます。ため、手動のstubと比べ自分で制御しにくい結果を自分で完全に制御できないから、テストケースの失敗する可能性が高いまとめ今回はクラス間の依存性に対してどうやって単体テストするのかについて説明しました。stubとmockをどっちを使ったほうがいいと聞かれても、正直ケース・バイ・ケースとしか答えようがありません。単体テストにおいては正しい一見識を持つことが非常に大事です。間違った考えで単体テストを書いてしまうと、書けば書くほど単体テストのメリットを享受できず、どんどん落胆します。最終的に単体テストを書くことを諦めてしまうでしょう。私も一回それで挫折したことがありました。私の考えは絶対に正しいであることは担保できませんが、少なくとも私が単体テストに対して悩みに悩んで熟慮した結果、このコンテンツが生まれました。何か意見があれば遠慮なくご連絡ください。