как протестировать REST-приложение (созданное с помощью apache-cxf) с помощью jersey-test-framework - PullRequest
2 голосов
/ 11 мая 2011


Я хотел бы знать, как я могу протестировать REST-приложение, разработанное с использованием Apache CXF и Spring, с помощью Jersey Test Framework (JTF).

Приложение состоит из нескольких модулей Maven, из которых "app-rest" интегрирует их и предоставляет интерфейс REST для тестирования.

Я создал отдельный модуль Maven, который содержит тесты, в которых в качестве зависимости используется app-rest, но я получаю исключение, подобное этому:

BeanDefinitionStoreException: IOException parsing XML document from class path resource  

при запуске тестов.
Я думаю, это потому, что app-rest не правильно развернут во встроенном контейнере.

Я пытался поместить тесты в модуль "app-rest", но вместо этого получаю:

RuntimeException: The scope of the component class org.apache.cxf.jaxrs.provider.AtomFeedProvider must be a singleton

Я запускаю тест с этой командной строкой:

mvn test -Dtest=JerseyRestTest -Djersey.test.containerFactory=com.sun.jersey.test.framework.spi.container.grizzly.web.GrizzlyWebTestContainerFactory

Это мой файл pom.xml для модуля испытаний:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>project-group-id</groupId>
        <artifactId>projectname</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <groupId>project-group-id</groupId>
    <artifactId>integration-tests</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Integration Tests of REST interface</name>
    <!-- build -->
    <build>
        <finalName>${project.artifactId}</finalName>
    </build>
    <!-- additional repositories -->
    <repositories>
        <repository>
            <id>java.net.m2</id>
            <url>http://download.java.net/maven/2/</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>project-group-id</groupId>
            <artifactId>app-rest</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>war</type>
            <scope>test</scope>
        </dependency>
        <!-- JUnit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
        <!-- Jersey stuff -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.6</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey.jersey-test-framework</groupId>
            <artifactId>jersey-test-framework-grizzly</artifactId>
            <version>1.6</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-spring</artifactId>
            <version>1.6</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

Простой тест:

public class JerseyRestTest extends JerseyTest {
    public JerseyRestTest() {
        super(new WebAppDescriptor.Builder("projectname.resource")
                .servletClass(SpringServlet.class)
                .contextParam("contextConfigLocation", "classpath:META-INF/spring/context-rest.xml")
                .contextListenerClass(org.springframework.web.context.ContextLoaderListener.class)
                .contextPath("app-rest")
                .build());
    }

    @Test
    public void testSomeResource() {
        String response = resource().path("/rest/resources").get(String.class);
        Assert.assertNotNull("No text returned!", response);

        assertResponseContains(response, "<html>");
        assertResponseContains(response, "</html>");
    }

    protected void assertResponseContains(String response, String text) {
        Assert.assertTrue("Response should contain " + text + " but was: " + response, response.contains(text));
    }
}

Большое спасибо!

...