【テスト】結合度の高いコードにオブジェクト結合部を作成してテストをしやすくする

目次

はじめに

テストを作成していると、結合度の高いコードがメソッド内に記述されていて想定しているテストをするのが困難な場合や、テストのときだけふるまいを変えたい場合が出てきます。

例えば、以下のコードのように、テストでは呼ばれてほしくないグローバルクラスのWriteメソッドがあるというコードがある場合、

1
2
3
4
5
6
public int Calculate(int value)
{
int result = latestValue + value;
Log.Write(); // このコードの処理はテストでは呼び出されたくない
return result;
}

そのコードをラップする関数をそのクラス内にprotected virtualなメソッドとして作成します。

1
2
3
4
5
6
7
8
9
10
11
12
protected virtual void WriteLog()
{
Log.Write(); // このクラスを呼び出すときはここが処理される
}


public int Calculate(int value)
{
int result = latestValue + value;
WriteLog(); // グローバルクラスのメソッドから、クラス内のメソッドを呼ぶように変更する
return result;
}

この書き方に変更しても、実際の処理は変更されません。

テストを、書くときはテスト用の先ほど編集したクラスを継承したFakeクラスを作成して使用します。

先ほどのクラスには、virtualメソッドがあるので実装を強制できます。
テストで使用する場合は、WriteLogクラスの中身を変更することで、Calcrateクラスの挙動を本番とは違う動作をさせることができるようになります。

1
2
3
4
protected override void WriteLog()
{
// 何も書かなければ、処理はされないLog.Write()の処理はされない
}

【テスト】結合度の高いコードにオブジェクト結合部を作成してテストをしやすくする

https://blog.djima.net/2021/09/09/【テスト】結合度の高いコードにオブジェクト結合部を作成してテストをしやすくする/

Author

Daiki Iijima

Posted on

2021-09-09

Updated on

2024-04-17

Licensed under