2012-05-17 5 views
16

更新静的クラス/メソッド/プロパティ、それを止めるか

静的クラス/メソッド/プロパティは、それをテストする方法がないことを考えると、ユニットテスト開発環境で使用されるべきです再度テスト可能ではないラッパーを導入することなく?

もう1つのシナリオは、静的メンバーがユニットテスト済みのターゲット内で使用されている場合、静的メンバーを嘲笑することができないことです。したがって、ユニットテストの対象がテストされたときに静的メンバーをテストする必要があります。静的メンバーが計算を実行するときにそれを切り離したいとします。

答えて

32

テスト静的メソッドは、(問題を提起する別のテストモジュール内依存としての静的メソッドを持つ任意の他の方法をテストするよりも違いはありません。彼らは一般的に(嘲笑することはできません。あなたがフリーツールでモック/スタブすることはできません)しかし、静的メソッドそのものが単体テストであれば、簡単にtreat it as working, reliable componentを入力することができます。

全体的に、間違いはありませんユニットテスト/ TDD)を以下の場合に静的メソッドで使用します。

  • それはシンプルで、入力・出力方法、それはそれはあなたによってテストユニットのどちらかだ私たちが意味することで、信頼性の高いであるか、あなたが信頼できると判断サードパーティのソースから来て
  • のすべての種類は、「これはことを考えると計算します」) (例えば。 Math.Floorは信頼できると見なされる可能性があります。使用しないでください。「見てください、静的です!警告;マイクロソフトがその仕事をしていると思われるかもしれません。)

静的メソッドは問題を引き起こすので避けるべきですか?基本的にのみ、彼らはあなたが(またはモック)を制御することができない何かを/ と対話するとき:

  • ファイルシステムのすべての種類、データベース、ネットワークの依存関係
  • 内部から呼び出され
  • 他の(おそらくより複雑な)静的メソッドあなたのモックフレームワークは、通常の条件
  • に対処することはできません
  • ほとんど何

編集:二つの例のときの静的メソッドあなたがFile.ReadAllTextに対処するにはどうすればよい

public int ExtractSumFromReport(string reportPath) 
{ 
    var reportFile = File.ReadAllText(reportPath); 
    // ... 
} 

ユニットテストは難しいでしょうか?これは明らかにファイルシステムにファイル内容を取得するために行われます。これは、単体テストの際には重要ではありません。これは、外部依存関係を持つ静的メソッドの例です。これを避けるには、通常、ファイルシステムapiの周りにラッパーを作成するか、単純にそれを依存関係/デリゲートとして挿入します。これについて

public void SaveUser(User user) 
{ 
    var session = SessionFactory.CreateSession(); 
    // ... 
} 

何?セッションはであり、非自明なものはです。確かに、それはISessionのようになるかもしれませんが、どのようにSessionFactoryがモックを返すように強制するのですか?私たちはできません。そして我々はセッションオブジェクトのいずれかを決定するのが容易なを作成することはできません。

上記のような場合は、静的メソッドを完全に避けることをお勧めします。

+1

静的メソッドが計算を実行するときはどうなりますか?それはインスタンスメソッドを作る必要がありますか? – Pingpong

+2

@ピンポン:少し拡大できますか? 'Math.Floor'は計算を行います - 私たちはそれを嘲笑しますか? 'Math.Floor(2.5)'が2を返すことを知っているからです。入出力が**簡単に判別できれば**何かを模倣する必要はありません(インスタンスを使用する)。静的メソッド全体は、テストが難しくなります*。それらが非自明な依存関係を提供するか副作用がある状況から来ます。私の編集を参照してください。 –

+0

静的メソッドは、長いプロセスの計算を実行するカスタムメソッドですか? – Pingpong

2

静的メソッド/プロパティをモックすることはできません。だから、あなたのclassAclassBという静的なメンバーを使うときは、classAを単独でテストすることはできません。

更新:いくつかの静的クラスをオブジェクトにラップするという問題はありません。それは時間がかかりませんが、システムでの結合を減らすことができます。

4

スタティックメソッドCANユニットテスト済みです。 Molesのようにこれを行うには、いくつかのフレームワークがあります

+0

しかし、これは単純なケースでは過剰です。 Molesはビルドプロセスで統合され、.netのためだけに利用可能です。 – undefined

0

Javaの静的メソッドをPowerMockでモックしますが、これを行う必要がある場合は、コードをリファクタリングすることを真剣にお勧めします。私は、静的メソッドは常にprivateであり、内部目的のために定義されたクラスの内部でのみ使用されるべきだと思います。私は公開された静的メソッドをa code smellと考えています。

関連する問題