Spring boot Spring boot集成测试JAX-RS资源

Spring boot Spring boot集成测试JAX-RS资源,spring-boot,jax-rs,integration-testing,jersey-2.0,jersey-client,Spring Boot,Jax Rs,Integration Testing,Jersey 2.0,Jersey Client,我正在使用SpringBoot2.0.3.RELEASE并创建一个简单的Jersey JAX-RS资源(使用Jersey SpringBootStarter)。我想使用我编写的Jersey客户机类做一个简单的集成测试,但是当我得到一个java.net.ConnectException:Connection-densed 我们开始吧,首先是简单的资源 @Component @Path(Constants.STATUS_PATH) public class StatusResource {

我正在使用SpringBoot2.0.3.RELEASE并创建一个简单的Jersey JAX-RS资源(使用Jersey SpringBootStarter)。我想使用我编写的Jersey客户机类做一个简单的集成测试,但是当我得到一个
java.net.ConnectException:Connection-densed

我们开始吧,首先是简单的资源

@Component
@Path(Constants.STATUS_PATH)
public class StatusResource {

    private static final String OK = "OK";

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response getStatus() {
        return Response.ok(OK).build();
    }

}
泽西配置

@Component
public class JerseyConfig extends ResourceConfig {

    private static final Logger logger = LoggerFactory.getLogger(JerseyConfig.class);

    public JerseyConfig() {
        logger.debug("Registering JAX-RS resources");
        register(StatusResource.class);
    }

}
Spring启动应用程序类

@SpringBootApplication
public class Application {

    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        logger.info("==== Starting Services ====");
        SpringApplication.run(Application.class, args);
    }

}
泽西岛客户

public class ServicesClient {

    private static final Logger logger = LoggerFactory.getLogger(ServicesClient.class);

    private Client client;

    public ServicesClient() {
        client = initJerseyClient();
    }

    private Client initJerseyClient() {
        logger.debug("Initialising Jersey Client");
        ClientConfig jerseyClientConfig = new ClientConfig();
        return ClientBuilder.newClient(jerseyClientConfig);
    }

    /**
     * Returns OK if services are running
     * 
     * @return service status
     */
    public String getServicesStatus() {
        logger.debug("Client get services status request");

        Response respone = client.target("http://localhost:8080").path(Constants.STATUS_PATH).request().get();

        return respone.readEntity(String.class);
    }
}
最后是Spring Boot集成测试

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = Application.class)
public class StatusResourceTest {

    private static Logger logger = LoggerFactory.getLogger(StatusResourceTest.class);

    private static ServicesClient servicesClient;

    @BeforeAll
    public static void setup() throws IOException {
        logger.debug("--- Starting StatusResourceTest setup ---");
        System.setProperty("services.client.file", "classpath:com/zurich/utils/services/config/services.yaml");
        servicesClient = new ServicesClientBuilder().build();
    }

    @Test
    public void testGetStatus() {
        logger.debug("--- Starting testGetStatus ---");

        String status = servicesClient.getServicesStatus();

        assertThat("Service status should be OK", status, equalTo("OK"));
    }

}
正如我所说,当测试运行并在客户机内部调用get时,我会得到以下堆栈跟踪。这对我来说意味着资源没有在
http://localhost:8080
但我不知道为什么

javax.ws.rs.ProcessingException: java.net.ConnectException: Connection refused: connect
    at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:284)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:278)
    at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$0(JerseyInvocation.java:753)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:414)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:752)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:419)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:319)
    at com.xxx.utils.services.client.ServicesClient.getServicesStatus(ServicesClient.java:178)
    at sit.resource.status.StatusResourceTest.testGetStatus(StatusResourceTest.java:39)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
    at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:390)
    at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:282)
    ... 11 more

似乎问题出在
@springbootest
注释上,我将其更改为以下内容,现在可以正常工作了

@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)

似乎问题出在
@springbootest
注释上,我将其更改为以下内容,现在可以正常工作了

@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)