21

静的クラス/メソッド/プロパティをユニットテスト開発環境で使用する必要がありますか?これもテスト不可能なラッパーを導入せずにテストする方法はありませんか?

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

4

5 に答える 5

49

静的メソッドのテストは、他のメソッドのテストと同じです。別のテスト済みモジュール内で静的メソッドを依存関係として持つと、問題が発生します (言及されているように、無料のツールでモック/スタブすることはできません)。ただし、静的メソッド自体が単体テストされている場合は、それを機能する信頼できるコンポーネントとして単純に扱うことができます。

全体として、次の場合、静的メソッドを使用しても問題はありません (つまり、単体テスト/TDD を中断しません)。

  • それは単純な入出力方法です(あらゆる種類の「与えられたこれを計算する」
  • それは信頼できます。つまり、あなたによって単体テストされているか、信頼できると思われるサードパーティのソースから来ていることを意味します (たとえば、信頼Math.Floorできると見なされる可能性があります。これを使用しても、「注意してください、静的です!」という警告が発生することはありません。想定される場合があります)。マイクロソフトはその仕事をします)

静的メソッドが問題を引き起こし、回避する必要があるのはいつですか? 基本的に、彼らがあなたが制御できない(またはモックする)何かとやり取りしたり、何かをしたりする場合にのみ:

  • あらゆる種類のファイル システム、データベース、ネットワークの依存関係
  • 内部から呼び出されるその他の (おそらくもっと複雑な) 静的メソッド
  • モッキング フレームワークが通常の条件で処理できないほとんどすべて

編集: 静的メソッド単体テストを困難にする場合の2つの例

1

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

どのように対処しFile.ReadAllTextますか?これは明らかにファイル システムに移動してファイル コンテンツを取得しますが、これは単体テストでは絶対にダメです。これは、外部依存関係を持つ静的メソッドの例です。これを回避するには、通常、ファイル システム API の周りにラッパーを作成するか、単純に依存関係/デリゲートとして挿入します。

2

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

これはどうですか?セッションは重要な依存関係です。確かに、それは のようになるかもしれませんが、モックを返すISessionように強制するにはどうすればよいでしょうか? SessionFactoryできません。また、簡単に判別できるセッション オブジェクトを作成することもできません。

上記のような場合、静的メソッドを完全に避けるのが最善です。

于 2012-05-17T09:35:07.197 に答える
3

静的メソッドは単体テストできます。それらをモックすることはできません (一般に、 Molesのようにこれを行うフレームワークがいくつかあります。

于 2012-05-17T09:28:59.837 に答える
1

静的メソッド/プロパティをモックすることはできません。したがって、classA静的メンバーを使用する場合、単独でclassBテストすることはできません。classA

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

于 2012-05-17T09:28:32.210 に答える
0

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

于 2012-05-21T20:08:40.897 に答える
0

プログラミング言語に関係なくこの脅威を見つけますが、私の日常生活は PHP に関連しているため、PHP の静的メソッドを扱うための良いリソースは次のとおりですhttp://docs.mockery.io/en/latest/reference/public_static_properties.html

于 2018-06-18T21:48:13.970 に答える