Доступ к Spring beans в JerseyTest

Я пытаюсь понять, как получить доступ к компонентам Spring из подкласса JerseyTest. Расширение JerseyTest Мне удалось загрузить контекст Spring в свои тесты, но я не понял, как получить доступ к контексту Spring. Моя установка выглядит так:

public abstract class SpringJerseyTest extends JerseyTest {
    public SpringJerseyTest() throws Exception {
        super(new WebAppDescriptor.Builder("com.acme.resources")
            .contextPath("/")
            .contextParam("contextConfigLocation", "classpath:applicationContext.xml")
            .servletClass(SpringServlet.class)
            .contextListenerClass(ContextLoaderListener.class)
            .build());
    }

}

В настройке используется стандартный веб-контейнер Grizzly. Я никогда раньше не использовал Grizzly, но в Jetty я бы сделал что-то вроде этого:

    public Object getSpringBean(String beanName) {
        WebAppContext context = (WebAppContext) server.getHandler();
        ServletContext sc = context.getServletContext();
        WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(sc);
        return applicationContext.getBean(beanName);
    }

Может ли кто-нибудь указать мне правильное направление?


person ebaxt    schedule 12.01.2011    source источник
comment
Не уверен, есть ли другой способ обойти это, но я нашел это сообщение в блоге: geek.riffpie.com/2010/08/09/ Используя jersey-test-support, теперь я также могу использовать @Autowired в своих тестах.   -  person ebaxt    schedule 13.01.2011
comment
Похоже, что ссылка выше не работает, обновленная ссылка: geek.riffpie.com/   -  person crobicha    schedule 07.07.2015


Ответы (3)


Я использую наивный подход, но работает

public ResourceIT()
    {
        super(new WebAppDescriptor.Builder("amazingpackage")
                .servletClass(SpringServlet.class)
                .contextParam("contextConfigLocation", "classpath:/spring/context.xml")
                .contextListenerClass(ContextLoaderListener.class)
                .contextPath("context")
                .build());
        injectedBean = ContextLoaderListener
                .getCurrentWebApplicationContext().getBean(InjectedBean.class);
    }
person Luis Ramirez-Monterosa    schedule 26.03.2013

Использовал решение, описанное здесь в течение недели, и все работает нормально.

person ebaxt    schedule 19.01.2011

Я не понимаю необходимости JerseyTest, который использует Spring bean, часто ваши Spring Beans являются слоем Service / Dao, и они должны быть Unit test / Integration Test на своем уровне с использованием Mockito или DBUnit (тесты интеграции).

Я проводил модульное тестирование классов ресурсов Джерси, используя компоненты Sprig в качестве имитаторов, это потому, что вам нужно изолировать тесты и тестировать только материалы Джерси (и Json) в JerseyTest, а не Service или Dao Layer., Да, я передаю свой Spring bean контекст, но весенние бины - это всего лишь макеты, потому что я не хочу тестировать весенние бины в JerseyTests.

Если вы изолируете свои тесты, будет легче писать и поддерживать свои тесты.

person user1648865    schedule 08.07.2014