簡體   English   中英

球衣測試+ HK2 +注入工廠服務

[英]Jersey Test + HK2 + Inject Factory service

我正在嘗試在Jersey測試類中注入HK2工廠服務提供的對象,但是得到不滿意的依賴項異常。

我有如下的工廠服務

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

還有澤西測試班

    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 = false,unqualified = null,2053349061沒有對象可用於注入)
  2. java.lang.IllegalArgumentException:嘗試解決com.test.factories.TestFactory的依賴關系時發現錯誤
  3. java.lang.IllegalStateException:無法執行操作:在com.test.factories.TestFactory上解析

CloseableService是澤西應用程序提供的服務。 您創建的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);
                }
            })
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM