2016-07-14 2 views
1

Я пытаюсь написать функциональные тесты для моего REST API с использованием рамки теста Jersey. Тем не менее, я, похоже, попал в блокпост, когда речь заходит об использовании инъекции зависимостей в рамках моих функциональных тестов. Мое главное приложение выглядит следующим образом:Функциональные тесты с тестированием на Джерси, инъекция зависимостей гризли и HK2

@ApplicationPath("/") 
public class Application extends ResourceConfig { 

    private static final URI BASE_URI = URI.create("http://localhost:8080/api/"); 

    public static void main(String[] args) throws Exception { 
     System.out.println("Starting application..."); 

     final ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 

     final ResourceConfig resourceConfig = new ResourceConfig(); 
     resourceConfig.register(JacksonFeature.class); 
     resourceConfig.register(LoggingFeature.class); 
     resourceConfig.packages(true, "my.package.name"); 

     final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig, locator); 

     Runtime.getRuntime().addShutdownHook(new Thread(server::shutdownNow)); 

     server.start(); 

     Thread.currentThread().join(); 
    } 
} 

Заметьте здесь, что я использую метод ServiceLocatorUtilities.createAndPopulateServiceLocator() в ¯hk2 для того, чтобы прочитать файл hk2-metadata-generator. Этот метод создает объект ServiceLocator, который затем, в свою очередь, передается методу GrizzlyHttpServerFactory.createHttpServer. Все это отлично работает для запуска сервера Grizzly, однако теперь у меня есть вопрос, как создать функциональные тесты для моего приложения с помощью тестовой платформы Jersey?

Моего модульное тестирование в настоящее время выглядит следующим образом:

public class FormsResourceTest extends JerseyTest { 

    @Override 
    protected TestContainerFactory getTestContainerFactory() throws TestContainerException { 
     return new GrizzlyWebTestContainerFactory(); 
    } 

    @Test 
    public void testMe() { 
     Response response = target("/test").request().get(); 
     assertEquals("Should return status 200", 200, response.getStatus()); 
    } 

} 

Есть даже способ использовать локатор HK2 службы с каркасом Джерси Test или мне нужно лечить мое приложение как внешний контейнер и использовать поставщик внешних контейнеров, как описано здесь: External container?

Кроме того, поскольку это функциональные тесты, насмешливые инъецируемые услуги здесь не являются вариантом.

+0

Почему вы не можете использовать AbstractBinder для привязки зависимостей (интерфейс к импликации), а затем зарегистрировать связующее средство в ResourceConfig и передать ResourceConfig на сервер? – Raf

+0

@Raf Это на самом деле направление, в которое я попал. Я понял, что лучше явно указывать свои зависимости вместо сканирования пакетов, чтобы найти их. –

ответ

0

Вы можете использовать Locator Bridge, чтобы взять два отдельных локатора (тот, который вы создали, и тот из Джерси) и свести их вместе. Мост также может быть выполнен двунаправленным (в пределах), и поэтому в большинстве случаев его использование будет одним большим ServiceLocator.

Обратите внимание, что на этой неделе была исправлена ​​ошибка, связанная с мостом ServiceLocator, который еще не был вытолкнут на maven, но будет (вероятно) нажата на следующей неделе. См. HK2-295

Смежные вопросы