1

依存性注入のために Google Guice で Jersey 1.X を使用しています。Jersey 2.X に切り替えるということは、代わりに依存性注入に HK2 を使用する必要があることを意味しているようです。

Guice を使用した Jersey 1.X では、アプリケーションは次のようになります。

public class GuiceServletTestConfig extends GuiceServletContextListener  {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule(){
            @Override
            protected  void configureServlets(){
                bind(MyResource.class);
                serve("/*").with(GuiceContainer.class);
                bind(MyDAO.class).to(MyDAOSQL.class)
            }
        });
    }
}

そして、テストの場合は次のようになります。

public class GuiceServletTestConfig extends GuiceServletContextListener  {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule(){
            @Override
            protected  void configureServlets(){
                bind(MyResource.class);
                serve("/*").with(GuiceContainer.class);
            }

            @Provides
            MyDAO provideMockMyDAO(){
                MyDAO dao = mock(MyDAO.class);
                return dao;
            }
        });
    }
}

私のリソースは次のようになります。

@Path("myresource")
public class MyResource {
    private MyDAO myDAO;

    @Inject
    protected void setMyDAO(MyDAO myDAO) {
        this.myDAO = myDAO;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response get() {
        // Do something with myDAO
        // Return response    
    }
}

つまり、テスト用のモックを定義でき、すべてが良好です。

ただし、Jersey 2.X では、@Provides アノテーションに相当するものが見つかりません。MyResource は事実上同じです。実際のアプリケーションの依存性注入については、次のものがあります。

public class Application extends ResourceConfig {
    public Application() {
        packages("com.my.package.resources");

        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(MyDAOSQL.class).to(MyDAO.class);
            }
        });
    }
}

しかし、テスト用のモックを提供する方法がわかりません。誰でも方法を知っていますか?

4

2 に答える 2

1

HK2 を使用すると、@Provides と同じように機能する Factory をバインドできます。ここにjavadocがあります。Factoryを実装するクラスを作成する必要があるため、それほど便利ではないと思います。CDI スタイルの @Produces を行うために Jira を拡張する可能性があります。

また、 Guice-HK2 ブリッジを使用することで、Jersey でも Guice を引き続き使用できます (多くの人がそうしています) 。Bridge の使用にはいくつかの制限があります (Guice によって作成されたクラスに @HK2Inject を使用する必要があるが、HK2 サービスで注入する必要があるなど) が、ほとんどの機能は引き続き機能します。

于 2014-04-04T11:48:40.890 に答える
0

OK、それで私は自分に合った方法を見つけました。がっかりしたことの 1 つは、bind().to()Guice から HK2 への交換です。Guice では、次のように記述します。

bind(Abstract.class).to(Concrete.class)

HK2 のように、次のように記述します。

bind(Concrete.class).to(Abstract.class)

Provides 動作を取得する方法は、次のコードで実現できます。

public class MyResourceIT extends JerseyTest {
    @Override
    protected Application configure() {
        ResourceConfig resourceConfig = new ResourceConfig();
        resourceConfig.register(MyResource.class);

        resourceConfig.register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(provideMyDaoMock()).to(MyDao.class);
            }

            private MyDao provideMyDaoMock() {
                MyDao myDaoMock = mock(MyDao.class);
                return myDaoMock;
            }
        });
        return resourceConfig;
    }
}
于 2014-04-04T12:00:36.887 に答える