Совместное тестирование CXF и Джерси вызывает конфликты в Spring? - PullRequest
1 голос
/ 03 августа 2010

У меня есть приложение, которое использует CXF в качестве SOAP-клиента и Jersey для представления сервисов REST, а классы Jersey управляются Spring.Это прекрасно работает в Tomcat;однако при попытке тестирования с JerseyTest у меня возникают конфликты SpringПохоже, что JerseyTest неправильно закрывает контекст Spring.

Инициализация теста для Джерси выглядит следующим образом:

public MailProviderTest()
    throws Exception
{
    super(new WebAppDescriptor.Builder("net.haltcondition.service.rest")
            .contextPath("")
            .contextParam("contextConfigLocation", "classpath:applicationContext.xml")
            .servletClass(SpringServlet.class)
            .contextListenerClass(ContextLoaderListener.class)
            .build());
}

Тесты CXF (которые взаимодействуют с тестовыми серверами нашего вышестоящего поставщика)выглядит так:

@Before
public void setup()
{
    // We need to do this the hard way to set the test endpoint rather than the default
    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setServiceClass(Soap.class);
    factory.setAddress("https://webservice.test.provider.com/Service.asmx");
    soap = (Soap) factory.create();

    Map<String,Object> outProps= new HashMap<String,Object>();
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    outProps.put(WSHandlerConstants.USER, "TESTUSER");
    outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new WSAuthHandler("XXXX"));

    Client cxfClient = ClientProxy.getClient(soap);
    Endpoint cxfEndpoint = cxfClient.getEndpoint();
    cxfEndpoint.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
}

Когда Maven запускает тесты, сначала запускается класс Джерси;это приводит к следующей ошибке при запуске тестов CXF:

Caused by: java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
    at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:153)
    at org.springframework.context.support.AbstractApplicationContext.containsBean(AbstractApplicationContext.java:892)
    at org.apache.cxf.configuration.spring.ConfigurerImpl.configureBean(ConfigurerImpl.java:143)
    at org.apache.cxf.configuration.spring.ConfigurerImpl.configureBean(ConfigurerImpl.java:113)
    at org.apache.cxf.transport.http.AbstractHTTPTransportFactory.configure(AbstractHTTPTransportFactory.java:228)

К сожалению, кажется, нет никакого способа принудительно завершить закрытие контекста приложения Spring в конце тестов Джерси и форсироватьвилки за тест не помогли.Похоже, мне нужно сбросить контекст приложения Spring как часть настройки теста CXF, но я не понимаю, как бы я это сделал.Любые указатели будут оценены.

...