Тест Джерси + HK2 + Inject Factory service - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь внедрить объект, предоставленный службой HK2 Factory, в тестовый класс в Джерси, но получаю исключение неудовлетворенных зависимостей.

У меня есть заводское обслуживание, как показано ниже

    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, квалификаторы = {}, position = 0, необязательный = false, self = false, неквалифицированный = нуль, 2053349061)
  2. java.lang.IllegalArgumentException: при попытке устранить зависимости com.test.factories.TestFactory были обнаружены ошибки
  3. java.lang.IllegalStateException: Невозможно выполнить операцию: решите в com.test.factories.TestFactory

1 Ответ

0 голосов
/ 30 апреля 2018

CloseableService - услуга, доступная в приложении в Джерси. Созданный вами ServiceLocator не привязан к приложению Джерси. Это просто автономный локатор. Поэтому попытка зарегистрировать 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);
                }
            })
    }
}
...