我一直在使用Jersey 1.X和Google Guice进行依赖注入。切换到Jersey 2.X似乎意味着你需要使用HK2代替依赖注入,我很难找到我在Guice中的一些东西。
在带有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);
}
});
}
}
但我不知道如何为测试提供模拟。谁知道怎么样?
答案 0 :(得分:1)
HK2允许您绑定像@Provides一样工作的工厂。这是javadoc。我认为它不方便,因为你必须创建一个实现Factory的类。我可以添加一个增强Jira来做一个CDI风格的@Produces。
此外,您可以使用Guice-HK2 bridge继续在泽西岛(很多人这样做)使用Guice。使用Bridge时有一些限制(比如必须使用@Kon2Inject来创建由Guice创建的类,但要注入HK2服务),但大多数事情仍然有效。
答案 1 :(得分:0)
好的,所以我想出了一种适合我的方式。让我失望的一件事是将bind().to()
从Guice交换到HK2。在Guice中,你写道:
bind(Abstract.class).to(Concrete.class)
在HK2中,你写道:
bind(Concrete.class).to(Abstract.class)
使用以下代码可以实现获取提供行为的方法:
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;
}
}