Browse Source

MockRestServiceServer test for follow-up request after failure

Issue: SPR-16132
pull/1581/head
Juergen Hoeller 7 years ago
parent
commit
295e3b6a99
  1. 9
      spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java
  2. 42
      spring-test/src/test/java/org/springframework/test/web/client/MockRestServiceServerTests.java
  3. 31
      spring-test/src/test/java/org/springframework/test/web/client/SimpleRequestExpectationManagerTests.java
  4. 18
      spring-test/src/test/java/org/springframework/test/web/client/UnorderedRequestExpectationManagerTests.java

9
spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java

@ -75,16 +75,15 @@ public abstract class AbstractRequestExpectationManager implements RequestExpect
@Override @Override
public ClientHttpResponse validateRequest(ClientHttpRequest request) throws IOException { public ClientHttpResponse validateRequest(ClientHttpRequest request) throws IOException {
List<ClientHttpRequest> requests = this.requests; synchronized (this.requests) {
synchronized (requests) { if (this.requests.isEmpty()) {
if (requests.isEmpty()) {
afterExpectationsDeclared(); afterExpectationsDeclared();
} }
try { try {
return validateRequestInternal(request); return validateRequestInternal(request);
} }
finally { finally {
requests.add(request); this.requests.add(request);
} }
} }
} }
@ -97,7 +96,7 @@ public abstract class AbstractRequestExpectationManager implements RequestExpect
} }
/** /**
* Sub-classes must implement the actual validation of the request * Subclasses must implement the actual validation of the request
* matching to declared expectations. * matching to declared expectations.
*/ */
protected abstract ClientHttpResponse validateRequestInternal(ClientHttpRequest request) protected abstract ClientHttpResponse validateRequestInternal(ClientHttpRequest request)

42
spring-test/src/test/java/org/springframework/test/web/client/MockRestServiceServerTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,25 +16,29 @@
package org.springframework.test.web.client; package org.springframework.test.web.client;
import java.net.SocketException;
import org.junit.Test; import org.junit.Test;
import org.springframework.test.web.client.MockRestServiceServer.MockRestServiceServerBuilder; import org.springframework.test.web.client.MockRestServiceServer.MockRestServiceServerBuilder;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; import static org.springframework.http.HttpMethod.*;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
import static org.springframework.test.web.client.response.MockRestResponseCreators.*;
/** /**
* Unit tests for {@link MockRestServiceServer}. * Unit tests for {@link MockRestServiceServer}.
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
*/ */
public class MockRestServiceServerTests { public class MockRestServiceServerTests {
private RestTemplate restTemplate = new RestTemplate(); private final RestTemplate restTemplate = new RestTemplate();
@Test @Test
public void buildMultipleTimes() throws Exception { public void buildMultipleTimes() {
MockRestServiceServerBuilder builder = MockRestServiceServer.bindTo(this.restTemplate); MockRestServiceServerBuilder builder = MockRestServiceServer.bindTo(this.restTemplate);
MockRestServiceServer server = builder.build(); MockRestServiceServer server = builder.build();
@ -56,7 +60,7 @@ public class MockRestServiceServerTests {
} }
@Test(expected = AssertionError.class) @Test(expected = AssertionError.class)
public void exactExpectOrder() throws Exception { public void exactExpectOrder() {
MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate) MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate)
.ignoreExpectOrder(false).build(); .ignoreExpectOrder(false).build();
@ -66,7 +70,7 @@ public class MockRestServiceServerTests {
} }
@Test @Test
public void ignoreExpectOrder() throws Exception { public void ignoreExpectOrder() {
MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate) MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate)
.ignoreExpectOrder(true).build(); .ignoreExpectOrder(true).build();
@ -78,7 +82,7 @@ public class MockRestServiceServerTests {
} }
@Test @Test
public void resetAndReuseServer() throws Exception { public void resetAndReuseServer() {
MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate).build(); MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate).build();
server.expect(requestTo("/foo")).andRespond(withSuccess()); server.expect(requestTo("/foo")).andRespond(withSuccess());
@ -92,7 +96,7 @@ public class MockRestServiceServerTests {
} }
@Test @Test
public void resetAndReuseServerWithUnorderedExpectationManager() throws Exception { public void resetAndReuseServerWithUnorderedExpectationManager() {
MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate) MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate)
.ignoreExpectOrder(true).build(); .ignoreExpectOrder(true).build();
@ -108,4 +112,24 @@ public class MockRestServiceServerTests {
server.verify(); server.verify();
} }
@Test // SPR-16132
public void followUpRequestAfterFailure() {
MockRestServiceServer server = MockRestServiceServer.bindTo(this.restTemplate).build();
server.expect(requestTo("/some-service/some-endpoint"))
.andRespond(request -> { throw new SocketException("pseudo network error"); });
server.expect(requestTo("/reporting-service/report-error"))
.andExpect(method(POST)).andRespond(withSuccess());
try {
this.restTemplate.getForEntity("/some-service/some-endpoint", String.class);
}
catch (Exception ex) {
this.restTemplate.postForEntity("/reporting-service/report-error", ex.toString(), String.class);
}
server.verify();
}
} }

31
spring-test/src/test/java/org/springframework/test/web/client/SimpleRequestExpectationManagerTests.java

@ -28,21 +28,15 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequest;
import org.springframework.mock.http.client.MockClientHttpRequest; import org.springframework.mock.http.client.MockClientHttpRequest;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.springframework.http.HttpMethod.GET; import static org.springframework.http.HttpMethod.*;
import static org.springframework.http.HttpMethod.POST; import static org.springframework.test.web.client.ExpectedCount.*;
import static org.springframework.test.util.AssertionErrors.fail; import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
import static org.springframework.test.web.client.ExpectedCount.max; import static org.springframework.test.web.client.response.MockRestResponseCreators.*;
import static org.springframework.test.web.client.ExpectedCount.min;
import static org.springframework.test.web.client.ExpectedCount.once;
import static org.springframework.test.web.client.ExpectedCount.times;
import static org.springframework.test.web.client.ExpectedCount.twice;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
/** /**
* Unit tests for {@link SimpleRequestExpectationManager}. * Unit tests for {@link SimpleRequestExpectationManager}.
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
*/ */
public class SimpleRequestExpectationManagerTests { public class SimpleRequestExpectationManagerTests {
@ -188,16 +182,17 @@ public class SimpleRequestExpectationManagerTests {
@Test // SPR-16132 @Test // SPR-16132
public void sequentialRequestsWithFirstFailing() throws Exception { public void sequentialRequestsWithFirstFailing() throws Exception {
this.manager.expectRequest(once(), requestTo("/foo")).andExpect(method(GET)) this.manager.expectRequest(once(), requestTo("/foo")).
.andRespond(request -> { throw new SocketException("pseudo network error"); }); andExpect(method(GET)).andRespond(request -> { throw new SocketException("pseudo network error"); });
this.manager.expectRequest(once(), requestTo("/handle-error")).andExpect(method(POST)).andRespond(withSuccess()); this.manager.expectRequest(once(), requestTo("/handle-error")).
andExpect(method(POST)).andRespond(withSuccess());
try { try {
this.manager.validateRequest(createRequest(GET, "/foo")); this.manager.validateRequest(createRequest(GET, "/foo"));
fail("expected exception"); fail("Expected SocketException");
} }
catch (SocketException e) { catch (SocketException ex) {
//expected // expected
} }
this.manager.validateRequest(createRequest(POST, "/handle-error")); this.manager.validateRequest(createRequest(POST, "/handle-error"));
this.manager.verify(); this.manager.verify();

18
spring-test/src/test/java/org/springframework/test/web/client/UnorderedRequestExpectationManagerTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -26,18 +26,15 @@ import org.junit.rules.ExpectedException;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequest;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.springframework.http.HttpMethod.GET; import static org.springframework.http.HttpMethod.*;
import static org.springframework.test.web.client.ExpectedCount.max; import static org.springframework.test.web.client.ExpectedCount.*;
import static org.springframework.test.web.client.ExpectedCount.min; import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
import static org.springframework.test.web.client.ExpectedCount.once; import static org.springframework.test.web.client.response.MockRestResponseCreators.*;
import static org.springframework.test.web.client.ExpectedCount.twice;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
/** /**
* Unit tests for {@link UnorderedRequestExpectationManager}. * Unit tests for {@link UnorderedRequestExpectationManager}.
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
*/ */
public class UnorderedRequestExpectationManagerTests { public class UnorderedRequestExpectationManagerTests {
@ -131,4 +128,5 @@ public class UnorderedRequestExpectationManagerTests {
throw new IllegalStateException(ex); throw new IllegalStateException(ex);
} }
} }
} }

Loading…
Cancel
Save