4

HK2 を使用しguice-bridgeて、Jersey 2.x を Guice 3.x に統合することができました。

public class MyApp extends ResourceConfig {

    @Inject
    public MyApp(ServiceLocator serviceLocator) {
        packages("com.mycompany");

        ...

        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(GuiceContext.INJECTOR);
    }
}

しかし、私のジャージーテストはもう機能しません。

public abstract class AbstractJerseyTest extends JerseyTest {

    public AbstractJerseyTest() throws TestContainerException {
        super(new InMemoryTestContainerFactory());
    }

    protected Application configure() {
        new MyApp(); // ERROR: missing 'ServiceLocator'
    }

}

ServiceLocatorでは、単体テスト用の はどこで取得できますか?

4

4 に答える 4

3

おそらく、よりクリーンなアプローチは、単純に を使用しFeatureてブリッジを構成することです。ResourceConfig

public class GuiceFeature implements Feature {

    public void configure(FeatureContext context) {
        ServiceLocator serviceLocator = ServiceLocatorProvider.getServiceLocator(context);
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(GuiceContext.INJECTOR);
    }
}

これは、他の機能と同様に登録できます。そのregisterままにするか、 でスキャンし@Providerます。

ServiceLocatorProviderは、 Jersey 2.6 以降でのみ使用できることに注意してください。

于 2015-09-09T01:46:44.727 に答える
3

これがうまくいった解決策です。

重要なのは、JerseyTest の configureDeployment() メソッドをオーバーライドし、configure() メソッドをオーバーライドして ResourceConfig インスタンスを返す代わりに、アプリケーション固有の ResourceConfig.class を渡すことによって DeploymentContext を作成することです。これにより、テスト コンテナーは Guice-bridge を正しく初期化します。

これは、Jersey、Guice、および HK2 guice-bridge の次のバージョンにあります。

    <jersey.version>2.15</jersey.version>
    <jackson2.version>2.4.4</jackson2.version>
    <hk2.guice.bridge.version>2.4.0-b10</hk2.guice.bridge.version>
    <guice.version>4.0-beta5</guice.version>

1) 私のサービスクラス

public interface MyService {
    public void hello();
}

2)私のモックサービス実装

public class MyMockServiceImpl implements MyService{
    public void hello() {
        System.out.println("Hi");
    }
} 

3) Guice が注入されたサービスを含む私の Resource クラス

@Path("myapp")
public class MyResource {

    private final MyService myService;

    @Inject
    public MyResource(MyService myService) {
        this.myService = myService;
    }
}

4) 私のリソース テスト クラス

public class MyResourceTest extends JerseyTestNg.ContainerPerClassTest {

    @Override
    protected Application configure() {
        return null;
    }

    @Override
    protected DeploymentContext configureDeployment() {
        return DeploymentContext.builder(MyTestConfig.class).build();
    }

    // other test and setup/teardown methods
}

5) ResourceConfig クラス

static class MyTestConfig extends ResourceConfig {

    @Inject
    public MyTestConfig(ServiceLocator serviceLocator) {

        packages("com.myapp.rest");

        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);

        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(Guice.createInjector(new MyTestModule()));

    }
}

6) 私の Guice テスト モジュール クラス

public class MyTestModule implements Module {

    @Override
    public void configure(Binder binder) {
            binder.bind(MyService.class)
               .to(MyMockServiceImpl.class);
    }

}
于 2015-02-16T01:45:09.110 に答える