トップ回答者
C#ではスタティックメソッドのオーバーライドができないので、スタブによるユニットテストが出来ない

質問
-
サーバとの通信部分をスタブ化して処理部分のユニットテストをしようと思っています。一般的には以下の様な方法となるかと思います。なお、通信クラスのプログラミングはすでに完了しています。
(クラス構成)
処理クラス(テスト対象) ---------------------------------------------------> 通信クラス(スタブ化対象)
+ 処理メソッド1 <- ユニットテストの対象メソッド。通信メソッド1をコールする。
+ 通信メソッド1 <- 通信オブジェクトの作成や通信オジェクトのメソッドコールをする。
(スタブによるユニットテスト)
※ 以下の様な「処理クラス」のサブクラスを作成して、この「処理メソッド1」を実行すると、テスト用にオーバーライドされた「通信メソッド1」がコールされる。
「処理クラス」のサブクラス
+ 通信メソッド1 <- 通信はせず、テスト用の応答をするプログラムで「オーバーライド」する。
ここで、問題なのが、今回のケースでは、「処理クラス」の全メソッドがスタティックなのです。
C#ではスタティックメソッドのオーバーライドが許されていないため、行き詰まってしまいました。Javaではスタティックメソッドのオーバーライドが出来るみたいです。
この問題の解決方法もしくは、別の良い方法などがありましたら、教えていただきたくよろしくお願いします。
なお、リファクタリングして、通信オブジェクトを処理メソッドのパラメータにするという方法もあるかと思いますが、できるだけ現在のプログラムは変更したくないと思っています。
回答
-
「通信クラス」の設計次第ですが、モックを作ったりファクトリ経由でインスタンスを作成したりです。http://msdn.microsoft.com/ja-jp/magazine/cc163358.aspx以下はJavaですが本質は変わりません。http://www.ibm.com/developerworks/jp/java/library/j-mocktest/要するに、「処理クラス」をサブクラス化したり何かすると本来のコードをテストしてる事にならないので、コードを変えずに「通信クラス」のインスタンスが変わるようにします。
http://takumayokoo.blogspot.com- 回答としてマーク HiroXX 2011年3月25日 12:37
すべての返信
-
>Javaではスタティックメソッドのオーバーライドが出来るみたいです。
できませんよ。インスタンスがないのでオーバーライドしても呼び出し方法がないでしょう。
処理クラスのスタティックメソッドをやめるか、通信クラスの方を直接newでインスタンス化せずに抽象化した方がよいでしょう。
そもそも処理クラスをサブクラス化して、オーバーライドしたメソッドをテストしても処理クラスをテストしたことにはならないのでは?(やり方次第だとは思いますが)
http://takumayokoo.blogspot.com
-
「通信クラス」の設計次第ですが、モックを作ったりファクトリ経由でインスタンスを作成したりです。http://msdn.microsoft.com/ja-jp/magazine/cc163358.aspx以下はJavaですが本質は変わりません。http://www.ibm.com/developerworks/jp/java/library/j-mocktest/要するに、「処理クラス」をサブクラス化したり何かすると本来のコードをテストしてる事にならないので、コードを変えずに「通信クラス」のインスタンスが変わるようにします。
http://takumayokoo.blogspot.com- 回答としてマーク HiroXX 2011年3月25日 12:37