Jersey Test + HK2 + Inject Factory 服务
Jersey Test + HK2 + Inject Factory service
我试图在 Jersey 测试中注入由 HK2 Factory 服务提供的对象 Class 但出现不满足的依赖项异常。
我有如下工厂服务
public class TestFactory implements Factory<TestObject>{
private final CloseableService closeService;
@Inject
public TestFactory(CloseableService closeService) {
this.closeService = closeService;
}
@Override
public TestObject provide() {
TestObject casualObject = new TestObject();
this.closeService.add(() -> dispose(casualObject));
return casualObject;
}
@Override
public void dispose(TestObject instance) {
instance.destroy();
}
}
还有球衣测试 class
public class SampleTestCass extends JerseyTestNg.ContainerPerClassTest
{
//@Inject
private TestObject myTestObject;
private ServiceLocator locator;
@Override
protected Application configure()
{
ResourceConfig resConfig = new ResourceConfig(MyApi.class);
resConfig.register(getBinder());
locator = setupHK2(getBinder());
return resConfig;
}
// setup local hk2
public setupHK2(AbstractBinder binder)
{
ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance();
ServiceLocator locator = factory.create("test-locator");
DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
DynamicConfiguration dc = dcs.createDynamicConfiguration();
locator.inject(binder);
binder.bind(dc);
dc.commit();
return locator;
}
// get the binder
public AbstractBinder getBinder()
{
return new AbstractBinder() {
@Override
protected void configure() {
bindFactory(TestFactory.class, Singleton.class).to(TestObject.class).in(PerLookup.class);
}
}
}
@BeforeClass
public void beforeClass()
{
myTestObject = locator.getService(TestObject.class);
// use myTestObject
}
@AfterClass
public void afterClass()
{
if (locator != null) {
locator.shutdown();
}
}
@Test()
public void someTest()
{
// some test code...
}
}
并低于例外情况
一个 MultiException 有 3 个异常。他们是:
- org.glassfish.hk2.api.UnsatisfiedDependencyException: 在 SystemInjecteeImpl(requiredType=CloseableService,parent=TestFactory,qualifiers={},position=0,optional=false,self=假,不合格=空,2053349061)
- java.lang.IllegalArgumentException:尝试解决 com.test.factories.TestFactory 的依赖项时发现错误
- java.lang.IllegalStateException:无法执行操作:在 com.test.factories.TestFactory
上解决
CloseableService
是 在 Jersey 应用程序中可用的服务。您创建的 ServiceLocator
未 绑定到 Jersey 应用程序。它只是一个独立的定位器。所以尝试用这个定位器注册 TestFactory
会导致它失败,因为没有 CloseableService
。您在 ResourceConfig
注册的那一个就可以正常工作。
不确定你到底想做什么,但如果你想在测试中访问服务,你可以做的一件事就是将服务绑定为一个实例,比如
class MyTest {
private Service service;
@Override
public ResourceConfig configure() {
service = new Service();
return new ResourceConfig()
.register(new AbstractBinder() {
@Override
public void configure() {
bind(service).to(Service.class);
}
})
}
}
我试图在 Jersey 测试中注入由 HK2 Factory 服务提供的对象 Class 但出现不满足的依赖项异常。
我有如下工厂服务
public class TestFactory implements Factory<TestObject>{
private final CloseableService closeService;
@Inject
public TestFactory(CloseableService closeService) {
this.closeService = closeService;
}
@Override
public TestObject provide() {
TestObject casualObject = new TestObject();
this.closeService.add(() -> dispose(casualObject));
return casualObject;
}
@Override
public void dispose(TestObject instance) {
instance.destroy();
}
}
还有球衣测试 class
public class SampleTestCass extends JerseyTestNg.ContainerPerClassTest
{
//@Inject
private TestObject myTestObject;
private ServiceLocator locator;
@Override
protected Application configure()
{
ResourceConfig resConfig = new ResourceConfig(MyApi.class);
resConfig.register(getBinder());
locator = setupHK2(getBinder());
return resConfig;
}
// setup local hk2
public setupHK2(AbstractBinder binder)
{
ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance();
ServiceLocator locator = factory.create("test-locator");
DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
DynamicConfiguration dc = dcs.createDynamicConfiguration();
locator.inject(binder);
binder.bind(dc);
dc.commit();
return locator;
}
// get the binder
public AbstractBinder getBinder()
{
return new AbstractBinder() {
@Override
protected void configure() {
bindFactory(TestFactory.class, Singleton.class).to(TestObject.class).in(PerLookup.class);
}
}
}
@BeforeClass
public void beforeClass()
{
myTestObject = locator.getService(TestObject.class);
// use myTestObject
}
@AfterClass
public void afterClass()
{
if (locator != null) {
locator.shutdown();
}
}
@Test()
public void someTest()
{
// some test code...
}
}
并低于例外情况
一个 MultiException 有 3 个异常。他们是:
- org.glassfish.hk2.api.UnsatisfiedDependencyException: 在 SystemInjecteeImpl(requiredType=CloseableService,parent=TestFactory,qualifiers={},position=0,optional=false,self=假,不合格=空,2053349061)
- java.lang.IllegalArgumentException:尝试解决 com.test.factories.TestFactory 的依赖项时发现错误
- java.lang.IllegalStateException:无法执行操作:在 com.test.factories.TestFactory 上解决
CloseableService
是 在 Jersey 应用程序中可用的服务。您创建的 ServiceLocator
未 绑定到 Jersey 应用程序。它只是一个独立的定位器。所以尝试用这个定位器注册 TestFactory
会导致它失败,因为没有 CloseableService
。您在 ResourceConfig
注册的那一个就可以正常工作。
不确定你到底想做什么,但如果你想在测试中访问服务,你可以做的一件事就是将服务绑定为一个实例,比如
class MyTest {
private Service service;
@Override
public ResourceConfig configure() {
service = new Service();
return new ResourceConfig()
.register(new AbstractBinder() {
@Override
public void configure() {
bind(service).to(Service.class);
}
})
}
}