Как тестировать блок памяти Spring-Jersey

Я работаю с Spring-Jersey3 и не могу понять, как тестировать RESTFul API с весенними бобами

controller

package com.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.service.DataSource; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("test") @Component public class SpringController { @Autowired private DataSource datasource; @GET @Produces(MediaType.TEXT_PLAIN) public String getHello() { return new String(datasource.load()); } } 

Интерфейс службы

 package com.service; public interface DataSource { public String load(); } 

Реализация услуг

 package com.service; import org.springframework.stereotype.Repository; @Repository public class DataSourceImpl implements DataSource { @Override public String load() { return "Hello"; } } 

ResourceRegister.java (реестр ресурсов Джерси)

 package com.component; import org.glassfish.jersey.server.ResourceConfig; import com.controller.SpringController; public class ResourceRegister extends ResourceConfig { public ResourceRegister () { register(SpringController.class); } } 

web.xml

    org.springframework.web.context.ContextLoaderListener   contextConfigLocation classpath:applicationContext.xml   Jersey org.glassfish.jersey.servlet.ServletContainer  javax.ws.rs.Application com.component.ResourceRegister  1   Jersey /*   к    org.springframework.web.context.ContextLoaderListener   contextConfigLocation classpath:applicationContext.xml   Jersey org.glassfish.jersey.servlet.ServletContainer  javax.ws.rs.Application com.component.ResourceRegister  1   Jersey /*   

serviceContext.xml (Контекст приложения)

      

Unit test << – У меня действительно нет идеи, как проверить это

 public class test extends JerseyTest { public test() { super("com.service", "com.controller"); } @Override protected AppDescriptor configure() { return new WebAppDescriptor.Builder("com.service","com.controller") .contextParam("contextConfigLocation", "classpath:serviceContext.xml") .contextPath("/rest") .servletClass("org.glassfish.jersey.servlet.ServletContainer.class") .initParam("javax.ws.rs.Application", "com.component.ResourceRegister") .build(); } @Test public void test() { Client client = new Client(); WebResource resource = client.resource("test"); ClientResponse response = resource.post(ClientResponse.class); assertEquals(200, resposne.getStatus()); } } 

Исходный код проекта

Проблема: инъекция зависимостей возвращает значение null

    Несколько вещей, которые я бы исправил:

    • Вы используете Джерси 1.x ароматизированную конструкцию испытания Джерси, но ваше приложение Джерси 2.x. См. Ниже для зависимости 2.x.

    • Я никогда не использовал тестовую платформу Jersey 1.x, но с Jersey 2.x контейнер In-Memory не поддерживает функции, зависящие от сервлета. Ниже приведены различные зависимости.

    • С помощью тестовой платформы Джерси вам не нужно самостоятельно создавать Client . Существует один созданный, и мы можем просто вызвать JerseyTest target(String path) метод target(String path) чтобы вернуть WebTarget (Jersey 2.x, WebResource – Jersey 1.x)

    Вот рефактор, который работает.

    Зависимость (я только добавил эту зависимость и ничего не понял, так как ваш проект GitHub не включал ничего связанного с тестированием, как показывает пример кода выше)

      org.glassfish.jersey.test-framework.providers jersey-test-framework-provider-grizzly2 2.15  

    Контрольная работа

     import com.component.ResourceRegister; import org.glassfish.jersey.servlet.ServletContainer; import org.glassfish.jersey.test.DeploymentContext; import org.glassfish.jersey.test.JerseyTest; import org.glassfish.jersey.test.ServletDeploymentContext; import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory; import org.glassfish.jersey.test.spi.TestContainerFactory; import org.junit.Assert; import org.junit.Test; import org.springframework.web.context.ContextLoaderListener; public class SpringTest extends JerseyTest { @Override protected TestContainerFactory getTestContainerFactory() { return new GrizzlyWebTestContainerFactory(); } @Override protected DeploymentContext configureDeployment(){ return ServletDeploymentContext .forServlet(new ServletContainer(new ResourceRegister())) .addListener(ContextLoaderListener.class) .contextParam("contextConfigLocation", "classpath:applicationContext.xml") .build(); } @Test public void test() { String response = target("test").request().get(String.class); Assert.assertEquals("Hello", response); System.out.println(response); } } 

    Для тех, кто не использует контекстный файл xml, вы можете использовать контекст приложения для аннотаций и добавить его как параметр init

     return ServletDeploymentContext .forServlet(new ServletContainer(new ResourceRegister())) .addListener(ContextLoaderListener.class) .initParam("contextConfig", new AnnotationConfigApplicationContext(YourSpringConfig.class)) .build(); 

    Другие источники:

    • Документация
    • Дополнительные примеры тестов тестов исходного кода Test Framework . (Подсказка: ссылка, которую я предоставил, для примеров веб-контейнеров гризли, но если вы вернетесь к провайдерам , вы можете посмотреть на каждого провайдера и перейти к тестовым пакетам для примеров для этих поставщиков)

    ОБНОВИТЬ

    Итак, после еще нескольких тестов, вот несколько интересных вещей, которые я обнаружил

    Один:

    С учетом вышеуказанной зависимости, даже если мы не настроим DeploymentContext и просто переопределим Application configure() в JerseyTest , он все равно будет работать. Не могу это объяснить, но, похоже, дескриптор все же поднят.

     import javax.ws.rs.core.Application; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.Assert; import org.junit.Test; public class SpringTest extends JerseyTest { @Override public Application configure() { return new ResourceConfig().packages("com.controller"); } @Test public void test() { String response = target("test").request().get(String.class); Assert.assertEquals("Hello", response); System.out.println(response); } } 

    Два:

    Даже если мы избавимся от вышеуказанной зависимости (grizzly) и используем зависимость в памяти, работает тот же самый простой предыдущий тест. В документации указано

    Контейнер с памятью не является реальным контейнером. Он запускает приложение «Джерси» и напрямую вызывает внутренние API-интерфейсы для обработки запроса, созданного клиентом, предоставленного тестовой средой. Связь с сетью отсутствует. Эти контейнеры не поддерживают сервлет и другие функции, зависящие от контейнера, но это идеальный выбор для простых модульных тестов.

    Поэтому я не совсем уверен, какие функции Servlet они имеют в виду, поскольку этот тест все еще работает

      org.glassfish.jersey.test-framework.providers jersey-test-framework-provider-inmemory 2.15  

    Я не понимаю, в частности, это утверждение

    «Нет сетевого взаимодействия»

    потому что когда я запускаю тест, я вижу журнал

    INFO: Creating InMemoryTestContainer configured at the base URI http://localhost:9998/

    Interesting Posts

    MongoDB: Как обновить несколько документов с помощью одной команды?

    Как защитить код сценария приложений в электронной таблице Google?

    Почему хороший дизайн пользовательского интерфейса так сложно для некоторых разработчиков?

    Java Swing: зачем изменять размер frameworks, чтобы добавить компоненты, добавленные

    Использование JasperReports с относительным путем

    Компиляторы и порядок аргументов оценки в C ++

    Каков наилучший способ изменить список в цикле foreach?

    Предупреждения о двойной ошибке указателя в C

    Менее сложный интерфейс для SQL Server

    Тоннельные адаптеры на ipconfig?

    Получение ошибки «Активность Java.lang.IllegalStateException была уничтожена» при использовании вкладок с ViewPager

    Добавление значений в массив C #

    Как «убедить» программы открыть реальный файл .lnk в Windows 7?

    Могу ли я переопределить кнопку «Главная» в моем приложении?

    Как установить выбранный элемент Spinner по значению, а не положением?

    Давайте будем гением компьютера.