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 个异常。他们是:

  1. org.glassfish.hk2.api.UnsatisfiedDependencyException: 在 SystemInjecteeImpl(requiredType=CloseableService,parent=TestFactory,qualifiers={},position=0,optional=false,self=假,不合格=空,2053349061)
  2. java.lang.IllegalArgumentException:尝试解决 com.test.factories.TestFactory 的依赖项时发现错误
  3. java.lang.IllegalStateException:无法执行操作:在 com.test.factories.TestFactory
  4. 上解决

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);
                }
            })
    }
}