Search code examples
javaspring-bootjerseyspring-cloud-contract

Spring-cloud-contract testing doesn't work for JAXRSCLIENT


With reference to thread (Spring Cloud Contract with Jersey), I was trying to contract test my Jersey controller. Unfortunately the maven plugin generates tests that doesn't compile.

My pom has plugin as below

             <plugin>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-contract-maven-plugin</artifactId>
                <version>2.2.1.RELEASE</version>
                <configuration>
                    <baseClassForTests>com.ing.api.orderapi.contractverifier.ContractVerifierBaseClass</baseClassForTests>
                    <testFramework>JUNIT5</testFramework>
                    <testMode>JAXRSCLIENT</testMode>
                </configuration>
            </plugin>

And the generated test is

@SuppressWarnings("rawtypes")
public class ContractVerifierTest extends ContractVerifierBaseClass {

    @Test
    public void validate_get_products() throws Exception {

        // when:
            Response response = webTarget
                            .path("/products")
                            .request()
                            .build("GET")
                            .invoke();

        // then:
            assertThat(response.getStatus()).isEqualTo(200);
    }

}

The webTarget in the test cannot be resolved. Kindly advice.


Solution

  • Please check this sample https://github.com/spring-cloud-samples/spring-cloud-contract-samples/tree/master/producer_jaxrs

    The code doesn't compile because you haven't defined the webtarget. Example

    package com.example;
    
    import java.net.URI;
    
    import javax.ws.rs.client.Client;
    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.client.WebTarget;
    import javax.ws.rs.core.UriBuilder;
    
    import com.example.beerapiproducerjaxrs.FraudDetectionController;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    import org.glassfish.jersey.client.ClientConfig;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    
    import static org.springframework.util.SocketUtils.findAvailableTcpPort;
    
    /**
     * Example of using pure Jersey / Jetty API / no Spring to setup the tests.
     */
    public class BeerRestBase {
        public static WebTarget webTarget;
    
        private static Server server;
    
        private static Client client;
    
        @BeforeClass
        public static void setupTest() throws Exception {
            int port = findAvailableTcpPort(10000);
            URI baseUri = UriBuilder.fromUri("http://localhost").port(port).build();
            // Create Server
            server = new Server(port);
            // Configure ServletContextHandler
            ServletContextHandler context = new ServletContextHandler(
                    ServletContextHandler.SESSIONS);
            context.setContextPath("/");
            server.setHandler(context);
            // Create Servlet Container
            ServletHolder jerseyServlet = context
                    .addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
            jerseyServlet.setInitOrder(0);
            // Tells the Jersey Servlet which REST service/class to load.
            jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
                    FraudDetectionController.class.getCanonicalName());
            // Start the server
            server.start();
            ClientConfig clientConfig = new ClientConfig();
            client = ClientBuilder.newClient(clientConfig);
            webTarget = client.target(baseUri);
            try {
                server.start();
            }
            catch (Exception ex) {
                throw new IllegalStateException(ex);
            }
        }
    
        @AfterClass
        public static void cleanupTest() {
            if (client != null) {
                client.close();
            }
            if (server != null) {
                try {
                    server.stop();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }