我需要测试我的RESTful服务,我认为最合适的方法是使用Jersey Test Framework因为我已经在使用Jersey服务了。
然而,当运行一个简单的测试时,我得到一个UnsatisfiedDependencyException
,因为找不到我在服务中使用的DAO的实现(它是通过DI设置的)。每次修改我的pom.xml
Maven配置文件时,这个错误都会发生在我身上,主要是在添加或删除依赖项时。据说,我使用的IDE,IntelliJ IDEA应该自动重新生成工件,但是为了避免这种依赖性故障,我需要从Tomcat服务器部署选项中删除旧工件。以及从项目结构,并再次添加。
问题在于测试框架正在使用单独的服务器,正如文档所述。我使用以下一个:
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>2.23.1</version>
</dependency>
如果我使用其他服务器,我不知道如何解决依赖问题。
异常堆栈中的顶部错误消息显示:
org.glassfish.hk2.api.UnsatisfiedDependencyException:没有 可在SystemInjecteeImpl
中注入的对象
有什么想法吗?
编辑。我设法用一个肮脏的解决方案修补它。
首先,让我告诉你我是如何注入DAO的:
// Binder.java
public class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(TournamentDao.class).to(ITournamentDao.class).in(Singleton.class);
}
}
// DependencyInjectionFeature.java
@Provider
public class DependencyInjectionFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(new Binder());
return true;
}
}
// EventSchedulerService.java
@Path("eventscheduler")
public class EventSchedulerService {
private ITournamentDao dao;
@Inject
public EventSchedulerService(ITournamentDao tournamentDao) {
dao = tournamentDao;
}
}
Web配置文件web.xml
扫描放置这些类的包(该包与测试所在的包的名称相同)并执行依赖注入,因为它找到了@Provider
注释
为了修补我的问题,我在测试类中完成了同样的事情:
public class EventSchedulerServiceTest extends JerseyTest {
protected Application configure() {
ResourceConfig config = new ResourceConfig(EventSchedulerService.class);
config.register(new AbstractBinder() {
@Override
protected void configure() {
bind(TournamentDao.class).to(ITournamentDao.class).in(Singleton.class);
}
});
return config;
}
}
显然这是一个坏主意,因为现在我有重复的代码;但它做到了伎俩。我想知道如何让测试服务器正确使用服务配置。
答案 0 :(得分:0)
我记得之前的讨论in the comments here,您遇到了不使用ResourceConfig
来配置主应用程序的问题。我们改为使用web.xml。
您使用Feature
注释@Provider
的原因是我们在您的web.xml中使用包扫描
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>your.packages.to.scan</param-value>
</init-param>
软件包扫描选中@Provider
上的Feature
,并自动注册。此提供程序用于注册Binder
,这是配置依赖项注入的内容。
如上所述,可以在ResourceConfig
或web.xml中配置Jersey应用程序。您可以在web.xml中执行任何球衣配置,也可以在ResourceConfig
中执行。您可以使用ResourceConfig
您只需拨打register
config.register(new DependencyInjectionFeature());
您也可以通过调用packages
config.packages("your.packages.to.scan");
您还应该查看Binder
类的实现。它扩展了AbstractBinder
。查看当前如何在测试中配置DI
config.register(new AbstractBinder() {
@Override
protected void configure() {
...
}
});
您正在注册AbstractBinder
个实例。所以你知道调用你可以在register
上注册调用ResourceConfig
的DI配置,这样你就可以注册一个Binder
类的实例而不是注册一个不同的绑定器
config.register(new Binder());
所以你有一些选择。