4

以下に示すクラスのフィールド「sf」をモックすることができます(現在Mockitoを使用していますが、他のテストライブラリでもある可能性があります):

public class SomeFilter implements Filter {

   private Logger log = Logger.getLogger(getClass());
   private SomeField sf = new SomeField();

   @Override
   public void init(FilterConfig fc) throws ServletException {
      log.info("");
   }

   @Override
   public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws     IOException, ServletException {
        fc.doFilter(request, response);
   }

   @Override
   public void destroy() {
      log.info("");
   }
}

もしそうなら、どのように?

4

4 に答える 4

4

Mockitoフレームワークとの統合など、いくつかの気の利いた機能を備えたPowerMockフレームワークを検討してください

以下のように、カプセル化をバイパスしてプライベート フィールドにアクセスするには、この例を検討してください。

String sf = Whitebox.getInternalState(o, "sf", String.class, B.class);
Whitebox.setInternalState(o, "sf", "XXX", B.class);

また、考慮してください(最後のリンクから):

これらはすべて、PowerMock を使用しなくても実現できます。これは、通常の Java リフレクションです。ただし、リフレクションには多くの定型コードが必要であり、エラーが発生しやすいため、PowerMock は代わりにこれらのユーティリティ メソッドを提供します。PowerMock では、コードをリファクタリングし、内部状態をチェック/変更するためのゲッター/セッター メソッドを追加するか、それとも、運用コードを変更せずに同じことを達成するためにそのユーティリティ メソッドを使用するかを選択できます。それはあなた次第です!

于 2012-12-19T09:28:40.860 に答える
3

はい。ReflectionTestUtilsTest クラスでは、Spring Framework から使用できます

http://static.springsource.org/spring/docs/2.5.5/api/org/springframework/test/util/ReflectionTestUtils.html

setField次のようにメソッドを呼び出します。

SomeFilter filter = new SomeFilter();
SomeField field = Mockito.mock(SomeField.class);
ReflectionTestUtils.setField(filter , "sf", field);

通常どおり、テスト ケース内のオブジェクトをモックできます。

Spring Framework をインポートできない場合でも、Java リフレクションを直接使用して同じことを行うのはそれほど難しくありません。

于 2012-12-19T09:07:16.857 に答える
2

protectedフィールドを作成するかpackage-private、テストにモックを挿入したくなるでしょう。たとえば、次のようになります。

final SomeField sf = mock(SomeField.class);
someFilter.sf = sf;

それ以外の場合は、コンストラクターを提供してモックを注入できます。

...
public SomeFilter() {
   this(new SomeField());
}


public SomeFilter(SomeField sf) {
    this.sf = sf;
}
...

次に、テストで次のようにモックを渡すことができます。

final SomeField sf = mock(SomeField.class);
SomeFilter someFilter = new SomeFilter(sf);
于 2012-12-19T09:12:46.557 に答える
1

PowerMock を使用して、SomeField クラスのコンストラクターをモックできます。ドキュメントから:

新しいオブジェクトのモック構築

  1. @RunWith(PowerMockRunner.class)テスト ケースのクラス レベルで注釈を使用します。@PrepareForTest(ClassThatCreatesTheNewInstance.class)テスト ケースのクラス レベルで注釈を使用し ます。
  2. 構築するクラスのモック オブジェクトを作成するために使用PowerMock.createMock(NewInstanceClass.class)します (mockObject と呼びましょう)。
  3. タイプ NewInstanceClass.class のオブジェクトの新しい構築を期待するために使用 PowerMock.expectNew(NewInstanceClass.class).andReturn(mockObject)しますが、代わりにモック オブジェクトを返します。
  4. PowerMock.replay(mockObject, NewInstanceClass.class)モック オブジェクトとクラスを再生モードに変更するために使用します。代わりに メソッドを使用し ますPowerMock.replayAll()
  5. PowerMock.verify(mockObject, NewInstanceClass.class)モック オブジェクトとクラスを検証モードに変更するために使用するか、メソッドを使用し ますPowerMock.verifyAll()

Mockito 構文で powermockを使用する場合は、次のようになります。

whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message"));
于 2013-01-13T20:16:41.007 に答える