From 43d88e4a250c913e9e4047efd20574e9cca96a82 Mon Sep 17 00:00:00 2001 From: Eric Pabst Date: Mon, 30 Oct 2017 08:53:13 -0600 Subject: [PATCH] Move requests.add(request) into finally block. This avoids "IllegalStateException: Expectations already declared" when a MockRestServiceServer is used after one request throws an exception. Issues: SPR-16132 --- .../AbstractRequestExpectationManager.java | 9 ++++++--- .../SimpleRequestExpectationManagerTests.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java index ed456417dd..9f16129267 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java @@ -80,9 +80,12 @@ public abstract class AbstractRequestExpectationManager implements RequestExpect if (requests.isEmpty()) { afterExpectationsDeclared(); } - ClientHttpResponse response = validateRequestInternal(request); - requests.add(request); - return response; + try { + return validateRequestInternal(request); + } + finally { + requests.add(request); + } } } diff --git a/spring-test/src/test/java/org/springframework/test/web/client/SimpleRequestExpectationManagerTests.java b/spring-test/src/test/java/org/springframework/test/web/client/SimpleRequestExpectationManagerTests.java index 1c6750243a..68a0925503 100644 --- a/spring-test/src/test/java/org/springframework/test/web/client/SimpleRequestExpectationManagerTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/client/SimpleRequestExpectationManagerTests.java @@ -16,6 +16,7 @@ package org.springframework.test.web.client; +import java.net.SocketException; import java.net.URI; import java.net.URISyntaxException; @@ -30,6 +31,7 @@ import org.springframework.mock.http.client.MockClientHttpRequest; import static org.junit.Assert.assertEquals; import static org.springframework.http.HttpMethod.GET; import static org.springframework.http.HttpMethod.POST; +import static org.springframework.test.util.AssertionErrors.fail; import static org.springframework.test.web.client.ExpectedCount.max; import static org.springframework.test.web.client.ExpectedCount.min; import static org.springframework.test.web.client.ExpectedCount.once; @@ -184,6 +186,23 @@ public class SimpleRequestExpectationManagerTests { this.manager.validateRequest(createRequest(GET, "/bar")); } + @Test // SPR-16132 + public void sequentialRequestsWithFirstFailing() throws Exception { + this.manager.expectRequest(once(), requestTo("/foo")).andExpect(method(GET)) + .andRespond(request -> { throw new SocketException("pseudo network error"); }); + this.manager.expectRequest(once(), requestTo("/handle-error")).andExpect(method(POST)).andRespond(withSuccess()); + + try { + this.manager.validateRequest(createRequest(GET, "/foo")); + fail("expected exception"); + } + catch (SocketException e) { + //expected + } + this.manager.validateRequest(createRequest(POST, "/handle-error")); + this.manager.verify(); + } + private ClientHttpRequest createRequest(HttpMethod method, String url) { try {