2

単体テストにリフレクションを使用しようとするのはこれが初めてで、この疑問がありました。

Class Example {
  public static Map<Something, Something> someMethod()
  {
    int temp = -1;
    //Some implementation which might change the value of temp
    //depending on other cases
    if(temp == -1)
      //Do something and return something
    else
      //return null
  }
}

上記のスニペットでは、tempリフレクションを使用して変数の初期値を取得できます。コードの実行中に変数の値が変更された場合、どうすれば新しい値を取得できますtempか? リフレクションの初心者なので、ばかげているように聞こえる場合はご容赦ください。

PS実際のコードがテストしているものはそれほど単純ではありません。ifリフレクションまたはパワーモックを使用しない と、最後の条件を単体テストできないと感じています。

4

3 に答える 3

4

リフレクションのある特定のイベントの後にトリガーされる変数のメソッドのようなものをフックすることはできません。単体テストで通常行うことは次のとおりです。

  1. 変数の初期状態を確認する
  2. アクションを実行する
  3. 変数の状態がまだ有効かどうかを確認します

2. のアクションが多すぎる場合 (その場合、あなたの質問は理解できます)、単体テストをよりきめ細かく記述する必要があります。

さらに、JUnit でローカル変数をチェックしたい場合は、メソッドの実装が複雑すぎる可能性があり、分割する必要があることを示しています。その場合、テストを改善し、それぞれをまったくテスト可能にすることができます。

また、次の質問への回答も参照してください: Is it bad practice to use Reflection in Unit testing?

于 2012-08-06T00:40:12.540 に答える
3

リフレクションを使用してローカル変数の状態にアクセスすることはできません。インスタンス変数はい、静的変数はい、ローカル変数いいえ。

また、@platzhirsch が指摘しているように、リフレクションでは、トリガーを任意の種類の変数にアタッチすることはできません。そのようなことには、何らかのバイトコードの変更が必要です。ただし、単体テストにはトリガーは必要ありません。前後の値を調べれば十分です。

ここでの本当の問題は、クラスが単体テストを容易にするように設計されていないことだと思います。まず、静的メソッドがあり、それらを「モック」するのは困難です。次に、テストしようとしているロジックがメソッドに埋め込まれているようです。(たとえば)tempがインスタンス変数である場合、または のコード// Some implementation ...がモックできるメソッドである場合は、はるかに簡単になります。


ところで、あなたの「プライベート」という用語の使用は、この文脈では誤解を招くものです。ほとんどの Java プログラマーは、「プライベート」をprivate修飾子付きの静的変数またはインスタンス変数を意味するものとして解釈します。しかし、あなたの例はtempローカル変数として宣言されており、private修飾子はローカル変数には許可されていません。

于 2012-08-06T00:39:16.953 に答える
2

他の人が指摘しているように、リフレクションを使用してローカル変数の状態にアクセスすることも、リフレクションを使用して「何かが変更された」場合に通知することもできません

ただし、デバッガー (Eclipse デバッガーなど) でコードを実行し、監視する変数に「ウォッチポイント」を設定することはできます

于 2012-08-06T00:44:34.200 に答える