4

私が使用しているフレームワークは Dropwizard 7、Guice で、テスト用に Jukito を使用した Junit を使用しています。dw で作成されたリソースがあり、そのリソースに対応するテスト ケースを作成する必要があります。注: 最近、dw 6 から dw 7 に移行しました。

dw 6 では、次のようなテスト ケースがありました。

@RunWith(JukitoRunner.class)
public class AbcResourceTest extends ResourceTest{
  @Inject
  private Provider<XyzAction> xyzProvider;
  public void setUpResources() throws Exception {
   addResource(new AbcResource(xyzProvider));
  }
  @Test
  public void doTesting() {
  }
}

このメソッドは問題なく機能し、Guice はすべての依存関係を注入し、リソースは問題なく初期化されます。

しかし、DW 7 では、リソース テストを記述するための構文が次のように変更されました。

public class ResourceTest {
 PersonDao personDao = mock(PersonDao.class);
 @Rule public ResourceTestRule resources = ResourceTestRule
      .builder()
      .addResource(new Resource(personDao))
      .build();
}

これは dw ドキュメントの例であり、正常に動作します。しかし、 PersonDao を嘲笑する代わりに、次のようなものを注入しようとすると:

@RunWith(JukitoRunner.class)
public class AbcResourceTest {
  @Inject
  private Provider<XyzAction> xyzProvider;
 @Rule public ResourceTestRule resources = ResourceTestRule
      .builder()
      .addResource((new AbcResource(xyzProvider))
      .build();
  @Test
  public void doTesting() {
  }
}

このコードは、xyzProvider の null 値でリソースをインスタンス化します。Guice は xyzProvider をインスタンス化しますが、それは @Rule が評価された後でのみです。今私の問題は、@Rule が評価される前に Guice に依存関係を注入することです。それを実現する方法はありますか?

4

1 に答える 1

4

これにより、実行JukitoRunner前に注射が行われると思われます。しかし、コンストラクタが終了する前にインジェクションを発生させることはできません。次のようなものがうまくいくかもしれません (Java 8 構文):@Rule

@Inject
private XyzAction xyz;

@Rule
public ResourceTestRule resources = ResourceTestRule
        .builder()
        .addResource(new AbcResource(() -> xyz))
        .build();
于 2015-07-07T23:31:59.487 に答える