【问题标题】:RestTemplate test fails with ResourceAccessExceptionRestTemplate 测试失败并出现 ResourceAccessException
【发布时间】:2014-12-02 03:30:55
【问题描述】:

我分叉了这个项目:

https://github.com/soudmaijer/drools

这里:

https://github.com/fastnsilver/drools

我更新了一些 POM 依赖项以使其更新,并且我添加了一个使用 RestTemplate 的客户端测试,该测试应该可以使用 FraudController

当我执行名为FraudControllerClientTest 的测试时,我得到一个ResourceAccessException

看到这个痕迹

Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 4.486 sec <<< FAILURE! - in com.oudmaijer.drools.fraud.FraudControllerClientTest
thatOrderSucceeds(com.oudmaijer.drools.fraud.FraudControllerClientTest)  Time elapsed: 0.251 sec  <<< ERROR!
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/fraud/check/order":Connection reset; nested exception is java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:189)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:136)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:152)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:270)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:161)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:153)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:254)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:91)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:568)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:537)
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:365)
at com.oudmaijer.drools.fraud.FraudControllerClientTest.thatOrderSucceeds(FraudControllerClientTest.java:41)

测试...

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = FraudApplication.class)
@WebAppConfiguration
@IntegrationTest
public class FraudControllerClientTest {

@Value("${env.baseUrl}")
private String baseUrl;

@Test
public void thatOrderSucceeds() {
    String uri = String.format("%s%s%s", baseUrl, Routes.BASE, Routes.ORDER);
    RestTemplate rest = new TestRestTemplate();
    ResponseEntity<Errors> response =
                    rest.postForEntity(uri, TestFixture.standardOrder(), Errors.class, Collections.EMPTY_MAP);
    assertEquals(HttpStatus.OK, response.getStatusCode());
    Errors errors = response.getBody();
    assertFalse(errors.hasErrors());
}

@Test
public void thatOrderFails() {
    String uri = String.format("%s%s%s", baseUrl, Routes.BASE, Routes.ORDER);
    RestTemplate rest = new TestRestTemplate();
    ResponseEntity<Errors> response =
                    rest.postForEntity(uri, TestFixture.suspiciousOrder(), Errors.class, Collections.EMPTY_MAP);
    assertEquals(HttpStatus.OK, response.getStatusCode());
    Errors errors = response.getBody();
    assertTrue(errors.hasErrors());
}

private static class TestFixture {

    static Order standardOrder() {
        return new Order("1", new Seller(5), new Address("456XYZ", 66));
    }

    static Order suspiciousOrder() {
        return new Order("1", new Seller(3), new Address("3452RK", 53));
    }
}
}

我有什么遗漏吗?我不能用RestTemplate 测试一个真正部署的 Spring Boot 应用程序吗?

【问题讨论】:

    标签: unit-testing maven exception spring-boot resttemplate


    【解决方案1】:

    结果当我启用此 VM arg -Djava.net.preferIPv4Stack=true 时,我得到一个“地址已在使用中”。接下来我运行sudo lsof -i -P | grep -i "listen" 来查看我在监听哪些端口。你猜怎么了?我有一个虚拟机启动并运行,暴露了 8080 端口。杀死了虚拟机。重新运行测试。等等。成功了!

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多