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

  • 質問

  • サーバとの通信部分をスタブ化して処理部分のユニットテストをしようと思っています。一般的には以下の様な方法となるかと思います。なお、通信クラスのプログラミングはすでに完了しています。

    (クラス構成)

    処理クラス(テスト対象) ---------------------------------------------------> 通信クラス(スタブ化対象)

     + 処理メソッド1 <- ユニットテストの対象メソッド。通信メソッド1をコールする。

     + 通信メソッド1 <- 通信オブジェクトの作成や通信オジェクトのメソッドコールをする。

    (スタブによるユニットテスト)

    ※ 以下の様な「処理クラス」のサブクラスを作成して、この「処理メソッド1」を実行すると、テスト用にオーバーライドされた「通信メソッド1」がコールされる。

    「処理クラス」のサブクラス 

     + 通信メソッド1 <- 通信はせず、テスト用の応答をするプログラムで「オーバーライド」する。

    ここで、問題なのが、今回のケースでは、「処理クラス」の全メソッドがスタティックなのです。

    C#ではスタティックメソッドのオーバーライドが許されていないため、行き詰まってしまいました。Javaではスタティックメソッドのオーバーライドが出来るみたいです。

    この問題の解決方法もしくは、別の良い方法などがありましたら、教えていただきたくよろしくお願いします。

    なお、リファクタリングして、通信オブジェクトを処理メソッドのパラメータにするという方法もあるかと思いますが、できるだけ現在のプログラムは変更したくないと思っています。

    2011年3月25日 9:08

回答

  • 「通信クラス」の設計次第ですが、モックを作ったりファクトリ経由でインスタンスを作成したりです。
    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
    2011年3月25日 12:00

すべての返信

  • >Javaではスタティックメソッドのオーバーライドが出来るみたいです。

    できませんよ。インスタンスがないのでオーバーライドしても呼び出し方法がないでしょう。

    処理クラスのスタティックメソッドをやめるか、通信クラスの方を直接newでインスタンス化せずに抽象化した方がよいでしょう。

    そもそも処理クラスをサブクラス化して、オーバーライドしたメソッドをテストしても処理クラスをテストしたことにはならないのでは?(やり方次第だとは思いますが)



    http://takumayokoo.blogspot.com

    2011年3月25日 9:37
  • ありがとうございます。一点だけ教えていただければと思います。

    ”通信クラスの方を直接newでインスタンス化せずに抽象化した方がよいでしょう” というところです。

    通信クラスを抽象化した場合、通信派生クラスのオブジェクトを「処理クラス」の「処理メソッド1」に使わせないといけないと思いますが、その間のやり取りのイメージがつかめません。また、本番プログラム使用時とテストプログラム使用時との切り替えのイメージも残念ながら湧きません。

    よろしければお教えください。

    2011年3月25日 10:43
  • 「通信クラス」の設計次第ですが、モックを作ったりファクトリ経由でインスタンスを作成したりです。
    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
    2011年3月25日 12:00
  • ありがとうございました。だいぶ見えてきました。リファクタリング&モック勉強中です。
    2011年3月25日 12:39