いつもお世話になります。
単体テスト初心者です。
XunitとMoqを使用してC#の単体テストを組んでいるのですが、Moqの Setup
メソッドについて、質問というか疑問があります。
色々調べてみたのですが、Setup
メソッドを使用してモッククラスを作る際、以下の2通りがあるという理解です。
- そのモッククラス内でフェイクするメソッドの対象が
virtual
である - またはモッククラスのインターフェイスを定義してインターフェイスをモッククラスにする必要がある
この点について、上記がモッククラスの作成条件となるならば、クラス設計が単体テストに引っ張られて作成する必要が出てくると思います。
これにすごく違和感があるのですが、こういうものなのでしょうか。
例えば単体テストするために、 virtual
メソッドを定義するというのは、ソースの見通しも悪くなりますし、やってはいけないと思うのですが・・・
この点について、考え方やそもそもの理解が間違っているのか、ご教授をお願い致します。
以下、SampleCodeです。
無理やりvirtualを使用する場合
C#
1[Fact] 2public void Test1() 3{ 4 var mock = new Mock<Class1>(); 5 mock.Setup(m => m.Value()).Returns(3); 6 Class1 test = mock.Object; 7 Assert.Equal(3, test.Value()); 8} 9 10public class Class1 11{ 12 // 単体テストするためにviertualにする必要がある 13 public virtual int Value() 14 { 15 return 0; 16 } 17}
無理やりインターフェイスを定義する場合
C#
1[Fact] 2public void Test2() 3{ 4 5 var mock2 = new Mock<IInterface>(); 6 mock2.Setup(m => m.Value()).Returns(4); 7 IInterface test2 = mock2.Object; 8 Assert.Equal(4, test2.Value()); 9} 10 11// 単体テストするために本来は不要であるインターフェイスを定義する必要がある 12// これは「インターフェイス分離の原則(ISP)」のやりすぎアンチパターンと思います 13public interface IInterface 14{ 15 int Value(); 16}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。