泽西岛测试依赖性注入GUICE



我无法将Jerseytest(v2.25(和Guice依赖注入一起使用。我当前的设置灵感来自另一个Stackoverflow问题上的答案。该设置仍试图通过HK2进行@Provides注释类的电线依赖性,但我的测试用例未能通过。如果我从测试ResourceConfig中删除.packages()调用,看来听众根本没有初始化,我的测试用例全部返回404。

这是我当前的球衣测试设置:

public class MyTestSuite extends JerseyTest {
    @Override
    protected Application configure() {
        return new ResourceConfig().packages("com.example.api");
    }
    @Override
    protected DeploymentContext configureDeployment() {
        return ServletDeploymentContext.builder(configure())
                .addListener(GuiceConfig.class)
                .addFilter(GuiceFilter.class, "guiceFilter")
                .addFilter(ServletContainer.class, "jerseyFilter", Collections.singletonMap("javax.ws.rs.Application", JerseyConfig.class.getName()))
                .build();
    }
}

这是部署上下文中引用的类:

public class GuiceConfig extends GuiceServletContextListener {
    static Injector injector;
    @Override
    protected Injector getInjector() {
        injector = Guice.createInjector(new WebModule());
        return injector;
    }
}
public class JerseyConfig extends ResourceConfig {
    @Inject
    public JerseyConfig(ServiceLocator serviceLocator) {
        Injector injector = (Injector) serviceLocator.getService(ServletContext.class).getAttribute(Injector.class.getName());
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
        serviceLocator.getService(GuiceIntoHK2Bridge.class).bridgeGuiceInjector(injector.createChildInjector(new HK2IntoGuiceBridge(serviceLocator)));
        packages("com.example.api");
    }
}
public class WebModule extends ServletModule {
    @Override
    protected void configureServlets() {
        serve("/*").with(ServletContainer.class, Collections.singletonMap(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName()));
    }
}

而不是编写自己的文章,您可以使用现有的图书馆guice模块

您需要弥合两个DI框架之间的缝隙。该模块的目的是通过启动基于码头的泽西服务器并初始化HK2和Guice之间的桥梁来做到这一点。

入门

  • 向您的Guice注射器添加泽西蛋白编码

  • 配置软件包以扫描资源和端口

  • 获取JerseyServer的实例,并开始消费您的RESTFUL资源

 compile 'io.logz:guice-jersey:1.0.8'

请注意,您缺少GuiceIntoHK2Bridge

Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName()); 
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(injector);

最新更新