静的クラス/メソッド/プロパティは、それをテストする方法がないことを考えると、ユニットテスト開発環境で使用されるべきです再度テスト可能ではないラッパーを導入することなく?
もう1つのシナリオは、静的メンバーがユニットテスト済みのターゲット内で使用されている場合、静的メンバーを嘲笑することができないことです。したがって、ユニットテストの対象がテストされたときに静的メンバーをテストする必要があります。静的メンバーが計算を実行するときにそれを切り離したいとします。
静的クラス/メソッド/プロパティは、それをテストする方法がないことを考えると、ユニットテスト開発環境で使用されるべきです再度テスト可能ではないラッパーを導入することなく?
もう1つのシナリオは、静的メンバーがユニットテスト済みのターゲット内で使用されている場合、静的メンバーを嘲笑することができないことです。したがって、ユニットテストの対象がテストされたときに静的メンバーをテストする必要があります。静的メンバーが計算を実行するときにそれを切り離したいとします。
テスト静的メソッドは、(問題を提起する別のテストモジュール内依存としての静的メソッドを持つ任意の他の方法をテストするよりも違いはありません。彼らは一般的に(嘲笑することはできません。あなたがフリーツールでモック/スタブすることはできません)しかし、静的メソッドそのものが単体テストであれば、簡単に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
がモックを返すように強制するのですか?私たちはできません。そして我々はセッションオブジェクトのいずれかを決定するのが容易なを作成することはできません。
上記のような場合は、静的メソッドを完全に避けることをお勧めします。
静的メソッド/プロパティをモックすることはできません。だから、あなたのclassA
がclassB
という静的なメンバーを使うときは、classA
を単独でテストすることはできません。
更新:いくつかの静的クラスをオブジェクトにラップするという問題はありません。それは時間がかかりませんが、システムでの結合を減らすことができます。
Javaの静的メソッドをPowerMockでモックしますが、これを行う必要がある場合は、コードをリファクタリングすることを真剣にお勧めします。私は、静的メソッドは常にprivate
であり、内部目的のために定義されたクラスの内部でのみ使用されるべきだと思います。私は公開された静的メソッドをa code smellと考えています。
静的メソッドが計算を実行するときはどうなりますか?それはインスタンスメソッドを作る必要がありますか? – Pingpong
@ピンポン:少し拡大できますか? 'Math.Floor'は計算を行います - 私たちはそれを嘲笑しますか? 'Math.Floor(2.5)'が2を返すことを知っているからです。入出力が**簡単に判別できれば**何かを模倣する必要はありません(インスタンスを使用する)。静的メソッド全体は、テストが難しくなります*。それらが非自明な依存関係を提供するか副作用がある状況から来ます。私の編集を参照してください。 –
静的メソッドは、長いプロセスの計算を実行するカスタムメソッドですか? – Pingpong