From 7d96ad1f6ece5534092ff537d9f89f914a9c2566 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Fri, 18 Mar 2016 09:09:17 -0500 Subject: [PATCH 1/2] MockMvc HtmlUnit support shares CookieManager Previously MockMvc builders failed to share the WebConnection used for managing cookies in the MockMvcWebConnection. This meant that the various CookieManagers would have different states. This commit ensures that the WebConnection is set on the MockMvcWebConnection. Fixes SPR-14066 --- .../htmlunit/MockMvcWebClientBuilder.java | 2 +- .../htmlunit/MockMvcWebConnection.java | 40 ++++++++-- .../MockMvcWebConnectionBuilderSupport.java | 40 +++++++++- .../MockMvcHtmlUnitDriverBuilder.java | 2 +- .../WebConnectionHtmlUnitDriver.java | 8 +- .../MockMvcConnectionBuilderSupportTests.java | 77 +++++++++++++++++-- .../MockMvcWebClientBuilderTests.java | 20 +++++ .../htmlunit/MockMvcWebConnectionTests.java | 3 +- .../MockMvcHtmlUnitDriverBuilderTests.java | 24 ++++++ 9 files changed, 197 insertions(+), 19 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilder.java index 5dc12a21182..94cc1ea8653 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilder.java @@ -106,7 +106,7 @@ public class MockMvcWebClientBuilder extends MockMvcWebConnectionBuilderSupport< */ public MockMvcWebClientBuilder withDelegate(WebClient webClient) { Assert.notNull(webClient, "WebClient must not be null"); - webClient.setWebConnection(createConnection(webClient.getWebConnection())); + webClient.setWebConnection(createConnection(webClient)); this.webClient = webClient; return this; } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java index d7a6fe60872..184d0b7ec7d 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java @@ -63,16 +63,16 @@ public final class MockMvcWebConnection implements WebConnection { private WebClient webClient; - /** * Create a new instance that assumes the context path of the application * is {@code ""} (i.e., the root context). *

For example, the URL {@code http://localhost/test/this} would use * {@code ""} as the context path. * @param mockMvc the {@code MockMvc} instance to use; never {@code null} + * @param webClient the {@link WebClient} to use. never {@code null} */ - public MockMvcWebConnection(MockMvc mockMvc) { - this(mockMvc, ""); + public MockMvcWebConnection(MockMvc mockMvc, WebClient webClient) { + this(mockMvc, webClient, ""); } /** @@ -83,17 +83,47 @@ public final class MockMvcWebConnection implements WebConnection { * which states that it can be an empty string and otherwise must start * with a "/" character and not end with a "/" character. * @param mockMvc the {@code MockMvc} instance to use; never {@code null} + * @param webClient the {@link WebClient} to use. never {@code null} * @param contextPath the contextPath to use */ - public MockMvcWebConnection(MockMvc mockMvc, String contextPath) { + public MockMvcWebConnection(MockMvc mockMvc, WebClient webClient, String contextPath) { Assert.notNull(mockMvc, "MockMvc must not be null"); + Assert.notNull(webClient, "WebClient must not be null"); validateContextPath(contextPath); - this.webClient = new WebClient(); + this.webClient = webClient; this.mockMvc = mockMvc; this.contextPath = contextPath; } + /** + * Create a new instance that assumes the context path of the application + * is {@code ""} (i.e., the root context). + *

For example, the URL {@code http://localhost/test/this} would use + * {@code ""} as the context path. + * @param mockMvc the {@code MockMvc} instance to use; never {@code null} + * @deprecated Use {@link #MockMvcWebConnection(MockMvc, WebClient)} + */ + @Deprecated + public MockMvcWebConnection(MockMvc mockMvc) { + this(mockMvc, ""); + } + + /** + * Create a new instance with the specified context path. + *

The path may be {@code null} in which case the first path segment + * of the URL is turned into the contextPath. Otherwise it must conform + * to {@link javax.servlet.http.HttpServletRequest#getContextPath()} + * which states that it can be an empty string and otherwise must start + * with a "/" character and not end with a "/" character. + * @param mockMvc the {@code MockMvc} instance to use; never {@code null} + * @param contextPath the contextPath to use + * @deprecated use {@link #MockMvcWebConnection(MockMvc, WebClient, String)} + */ + @Deprecated + public MockMvcWebConnection(MockMvc mockMvc, String contextPath) { + this(mockMvc, new WebClient(), contextPath); + } public void setWebClient(WebClient webClient) { Assert.notNull(webClient, "WebClient must not be null"); diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java index 6575e6a26ea..d60d2d4d1b2 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java @@ -19,6 +19,7 @@ package org.springframework.test.web.servlet.htmlunit; import java.util.ArrayList; import java.util.List; +import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.WebConnection; import org.springframework.test.web.servlet.MockMvc; @@ -145,10 +146,46 @@ public abstract class MockMvcWebConnectionBuilderSupport assertDelegateProcessed("http://example.com/")); } + // SPR-14066 + @Test + public void cookieManagerShared() throws Exception { + this.mockMvc = MockMvcBuilders.standaloneSetup(new CookieController()).build(); + this.webClient = mockMvcSetup(this.mockMvc).build(); + + assertThat(getWebResponse("http://localhost/").getContentAsString(), equalTo("")); + this.webClient.getCookieManager().addCookie(new Cookie("localhost", "cookie", "cookieManagerShared")); + assertThat(getWebResponse("http://localhost/").getContentAsString(), equalTo("cookieManagerShared")); + } + private void assertMvcProcessed(String url) throws Exception { assertThat(getWebResponse(url).getContentAsString(), equalTo("mvc")); } @@ -126,4 +139,11 @@ public class MockMvcWebClientBuilderTests { } } + @RestController + static class CookieController { + @RequestMapping("/") + public String cookie(@CookieValue("cookie") String cookie) { + return cookie; + } + } } diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionTests.java index 726c4f0bb66..78e207b2e15 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionTests.java @@ -36,6 +36,7 @@ import static org.junit.Assert.assertThat; * @author Rob Winch * @since 4.2 */ +@SuppressWarnings("deprecation") public class MockMvcWebConnectionTests { private final WebClient webClient = new WebClient(); @@ -50,7 +51,7 @@ public class MockMvcWebConnectionTests { @Test public void contextPathNull() throws IOException { - this.webClient.setWebConnection(new MockMvcWebConnection(this.mockMvc, null)); + this.webClient.setWebConnection(new MockMvcWebConnection(this.mockMvc, (String) null)); Page page = this.webClient.getPage("http://localhost/context/a"); diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java index 9fe37224bc2..3a1bf27a373 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java @@ -35,11 +35,14 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.tests.Assume; import org.springframework.tests.TestGroup; +import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import com.gargoylesoftware.htmlunit.util.Cookie; + import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.springframework.test.web.servlet.htmlunit.webdriver.MockMvcHtmlUnitDriverBuilder.*; @@ -111,6 +114,20 @@ public class MockMvcHtmlUnitDriverBuilderTests { assertFalse(this.driver.isJavascriptEnabled()); } + // SPR-14066 + @Test + public void cookieManagerShared() throws Exception { + WebConnectionHtmlUnitDriver delegateDriver = new WebConnectionHtmlUnitDriver(); + this.mockMvc = MockMvcBuilders.standaloneSetup(new CookieController()).build(); + this.driver = mockMvcSetup(this.mockMvc) + .withDelegate(delegateDriver) + .build(); + + assertThat(get("http://localhost/"), equalTo("")); + delegateDriver.getWebClient().getCookieManager().addCookie(new Cookie("localhost", "cookie", "cookieManagerShared")); + assertThat(get("http://localhost/"), equalTo("cookieManagerShared")); + } + private void assertMvcProcessed(String url) throws Exception { assertThat(get(url), containsString(EXPECTED_BODY)); } @@ -139,4 +156,11 @@ public class MockMvcHtmlUnitDriverBuilderTests { } } + @RestController + static class CookieController { + @RequestMapping("/") + public String cookie(@CookieValue("cookie") String cookie) { + return cookie; + } + } } \ No newline at end of file From d3822c8d19ac02d6274c669e7bff01a44322c873 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 18 Mar 2016 12:00:45 -0400 Subject: [PATCH 2/2] Polish --- .../htmlunit/DelegatingWebConnection.java | 3 +- .../MockMvcWebConnectionBuilderSupport.java | 40 ++--- .../MockMvcConnectionBuilderSupportTests.java | 146 +++++------------- .../MockMvcWebClientBuilderTests.java | 64 ++++---- .../MockMvcHtmlUnitDriverBuilderTests.java | 60 +++---- 5 files changed, 115 insertions(+), 198 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/DelegatingWebConnection.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/DelegatingWebConnection.java index 091681a86d1..50f6fa95a79 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/DelegatingWebConnection.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/DelegatingWebConnection.java @@ -37,8 +37,7 @@ import org.springframework.util.Assert; * WebClient webClient = new WebClient(); * * MockMvc mockMvc = ... - * MockMvcWebConnection mockConnection = new MockMvcWebConnection(mockMvc); - * mockConnection.setWebClient(webClient); + * MockMvcWebConnection mockConnection = new MockMvcWebConnection(mockMvc, webClient); * * WebRequestMatcher cdnMatcher = new UrlRegexRequestMatcher(".*?//code.jquery.com/.*"); * WebConnection httpConnection = new HttpWebConnection(webClient); diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java index d60d2d4d1b2..baef40419bd 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -23,6 +23,7 @@ import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.WebConnection; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.htmlunit.DelegatingWebConnection.DelegateWebConnection; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.setup.MockMvcConfigurer; import org.springframework.util.Assert; @@ -44,7 +45,7 @@ public abstract class MockMvcWebConnectionBuilderSupport mockMvcRequestMatchers = new ArrayList(); + private final List requestMatchers = new ArrayList(); private String contextPath = ""; @@ -58,7 +59,7 @@ public abstract class MockMvcWebConnectionBuilderSupport delegates = new ArrayList( - this.mockMvcRequestMatchers.size()); - for (WebRequestMatcher matcher : this.mockMvcRequestMatchers) { - delegates.add(new DelegatingWebConnection.DelegateWebConnection(matcher, mockMvcWebConnection)); + List delegates = new ArrayList(this.requestMatchers.size()); + for (WebRequestMatcher matcher : this.requestMatchers) { + delegates.add(new DelegateWebConnection(matcher, connection)); } - return new DelegatingWebConnection(defaultConnection, delegates); } + } diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcConnectionBuilderSupportTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcConnectionBuilderSupportTests.java index 9f74285074f..28a16b59192 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcConnectionBuilderSupportTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcConnectionBuilderSupportTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,10 @@ import java.io.IOException; import java.net.URL; import javax.servlet.http.HttpServletRequest; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebConnection; +import com.gargoylesoftware.htmlunit.WebRequest; +import com.gargoylesoftware.htmlunit.WebResponse; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,11 +40,6 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.WebConnection; -import com.gargoylesoftware.htmlunit.WebRequest; -import com.gargoylesoftware.htmlunit.WebResponse; - import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.Matchers.notNullValue; @@ -52,166 +51,101 @@ import static org.mockito.Mockito.when; * Integration tests for {@link MockMvcWebConnectionBuilderSupport}. * * @author Rob Winch + * @author Rossen Stoyanchev * @since 4.2 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @WebAppConfiguration -@SuppressWarnings({"rawtypes","deprecation"}) public class MockMvcConnectionBuilderSupportTests { - private WebConnection delegateConnection; - - private WebClient webClient; - @Autowired private WebApplicationContext wac; - private MockMvc mockMvc; + private WebClient client; + + private MockMvcWebConnectionBuilderSupport builder; - private WebConnection connection; @Before public void setup() { - delegateConnection = mock(WebConnection.class); - - webClient = mock(WebClient.class); - when(webClient.getWebConnection()).thenReturn(delegateConnection); - - - mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); - - connection = new MockMvcWebConnectionBuilderSupport(mockMvc){} - .createConnection(webClient); + this.client = mock(WebClient.class); + when(this.client.getWebConnection()).thenReturn(mock(WebConnection.class)); + this.builder = new MockMvcWebConnectionBuilderSupport(this.wac) {}; } + @Test(expected = IllegalArgumentException.class) public void constructorMockMvcNull() { - new MockMvcWebConnectionBuilderSupport((MockMvc)null){}; + new MockMvcWebConnectionBuilderSupport((MockMvc) null){}; } @Test(expected = IllegalArgumentException.class) public void constructorContextNull() { - new MockMvcWebConnectionBuilderSupport((WebApplicationContext)null){}; - } - - @Test - public void contextDeprecated() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .createConnection(webClient); - - assertMvcProcessed("http://localhost/"); - assertDelegateProcessed("http://example.com/"); - } - - @Test - public void mockMvcDeprecated() throws Exception { - assertMvcProcessed("http://localhost/"); - assertDelegateProcessed("http://example.com/"); - } - - @Test - public void mockMvcExampleDotComDeprecated() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .useMockMvcForHosts("example.com") - .createConnection(delegateConnection); - - assertMvcProcessed("http://localhost/"); - assertMvcProcessed("http://example.com/"); - assertDelegateProcessed("http://other.com/"); - } - - @Test - public void mockMvcAlwaysUseMockMvcDeprecated() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .alwaysUseMockMvc() - .createConnection(delegateConnection); - - assertMvcProcessed("http://other.com/"); - } - - @Test - public void defaultContextPathEmptyDeprecated() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .createConnection(delegateConnection); - - assertThat(getWebResponse("http://localhost/abc").getContentAsString(), equalTo("")); - } - - @Test - public void defaultContextPathCustomDeprecated() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .contextPath("/abc").createConnection(delegateConnection); - - assertThat(getWebResponse("http://localhost/abc/def").getContentAsString(), equalTo("/abc")); + new MockMvcWebConnectionBuilderSupport((WebApplicationContext) null){}; } @Test public void context() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .createConnection(webClient); + WebConnection conn = this.builder.createConnection(this.client); - assertMvcProcessed("http://localhost/"); - assertDelegateProcessed("http://example.com/"); + assertMockMvcUsed(conn, "http://localhost/"); + assertMockMvcNotUsed(conn, "http://example.com/"); } @Test public void mockMvc() throws Exception { - assertMvcProcessed("http://localhost/"); - assertDelegateProcessed("http://example.com/"); + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); + WebConnection conn = new MockMvcWebConnectionBuilderSupport(mockMvc) {}.createConnection(this.client); + + assertMockMvcUsed(conn, "http://localhost/"); + assertMockMvcNotUsed(conn, "http://example.com/"); } @Test public void mockMvcExampleDotCom() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .useMockMvcForHosts("example.com") - .createConnection(webClient); + WebConnection conn = this.builder.useMockMvcForHosts("example.com").createConnection(this.client); - assertMvcProcessed("http://localhost/"); - assertMvcProcessed("http://example.com/"); - assertDelegateProcessed("http://other.com/"); + assertMockMvcUsed(conn, "http://localhost/"); + assertMockMvcUsed(conn, "http://example.com/"); + assertMockMvcNotUsed(conn, "http://other.com/"); } @Test public void mockMvcAlwaysUseMockMvc() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .alwaysUseMockMvc() - .createConnection(webClient); - - assertMvcProcessed("http://other.com/"); + WebConnection conn = this.builder.alwaysUseMockMvc().createConnection(this.client); + assertMockMvcUsed(conn, "http://other.com/"); } @Test public void defaultContextPathEmpty() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .createConnection(webClient); - - assertThat(getWebResponse("http://localhost/abc").getContentAsString(), equalTo("")); + WebConnection conn = this.builder.createConnection(this.client); + assertThat(getResponse(conn, "http://localhost/abc").getContentAsString(), equalTo("")); } @Test public void defaultContextPathCustom() throws Exception { - connection = new MockMvcWebConnectionBuilderSupport(wac) {} - .contextPath("/abc").createConnection(webClient); - - assertThat(getWebResponse("http://localhost/abc/def").getContentAsString(), equalTo("/abc")); + WebConnection conn = this.builder.contextPath("/abc").createConnection(this.client); + assertThat(getResponse(conn, "http://localhost/abc/def").getContentAsString(), equalTo("/abc")); } - private void assertMvcProcessed(String url) throws Exception { - assertThat(getWebResponse(url), notNullValue()); + + private void assertMockMvcUsed(WebConnection connection, String url) throws Exception { + assertThat(getResponse(connection, url), notNullValue()); } - private void assertDelegateProcessed(String url) throws Exception { - assertThat(getWebResponse(url), nullValue()); + private void assertMockMvcNotUsed(WebConnection connection, String url) throws Exception { + assertThat(getResponse(connection, url), nullValue()); } - private WebResponse getWebResponse(String url) throws IOException { + private WebResponse getResponse(WebConnection connection, String url) throws IOException { return connection.getResponse(new WebRequest(new URL(url))); } @Configuration @EnableWebMvc + @SuppressWarnings("unused") static class Config { @RestController diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilderTests.java index d07c86faffe..c8e4b096009 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebClientBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -18,9 +18,12 @@ package org.springframework.test.web.servlet.htmlunit; import java.io.IOException; import java.net.URL; - import javax.servlet.http.HttpServletRequest; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebRequest; +import com.gargoylesoftware.htmlunit.WebResponse; +import com.gargoylesoftware.htmlunit.util.Cookie; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,20 +43,16 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.WebRequest; -import com.gargoylesoftware.htmlunit.WebResponse; -import com.gargoylesoftware.htmlunit.util.Cookie; - -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import static org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuilder.*; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; /** * Integration tests for {@link MockMvcWebClientBuilder}. * * @author Rob Winch * @author Sam Brannen + * @author Rossen Stoyanchev * @since 4.2 */ @RunWith(SpringJUnit4ClassRunner.class) @@ -61,8 +60,6 @@ import static org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuil @WebAppConfiguration public class MockMvcWebClientBuilderTests { - private WebClient webClient; - @Autowired private WebApplicationContext wac; @@ -74,54 +71,55 @@ public class MockMvcWebClientBuilderTests { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } + @Test(expected = IllegalArgumentException.class) public void mockMvcSetupNull() { - mockMvcSetup(null); + MockMvcWebClientBuilder.mockMvcSetup(null); } @Test(expected = IllegalArgumentException.class) public void webAppContextSetupNull() { - webAppContextSetup(null); + MockMvcWebClientBuilder.webAppContextSetup(null); } @Test public void mockMvcSetupWithDefaultWebClientDelegate() throws Exception { - this.webClient = mockMvcSetup(this.mockMvc).build(); + WebClient client = MockMvcWebClientBuilder.mockMvcSetup(this.mockMvc).build(); - assertMvcProcessed("http://localhost/test"); - Assume.group(TestGroup.PERFORMANCE, () -> assertDelegateProcessed("http://example.com/")); + assertMockMvcUsed(client, "http://localhost/test"); + Assume.group(TestGroup.PERFORMANCE, () -> assertMockMvcNotUsed(client, "http://example.com/")); } @Test public void mockMvcSetupWithCustomWebClientDelegate() throws Exception { - WebClient preconfiguredWebClient = new WebClient(); - this.webClient = mockMvcSetup(this.mockMvc).withDelegate(preconfiguredWebClient).build(); + WebClient otherClient = new WebClient(); + WebClient client = MockMvcWebClientBuilder.mockMvcSetup(this.mockMvc).withDelegate(otherClient).build(); - assertMvcProcessed("http://localhost/test"); - Assume.group(TestGroup.PERFORMANCE, () -> assertDelegateProcessed("http://example.com/")); + assertMockMvcUsed(client, "http://localhost/test"); + Assume.group(TestGroup.PERFORMANCE, () -> assertMockMvcNotUsed(client, "http://example.com/")); } - // SPR-14066 - @Test + @Test // SPR-14066 public void cookieManagerShared() throws Exception { this.mockMvc = MockMvcBuilders.standaloneSetup(new CookieController()).build(); - this.webClient = mockMvcSetup(this.mockMvc).build(); + WebClient client = MockMvcWebClientBuilder.mockMvcSetup(this.mockMvc).build(); - assertThat(getWebResponse("http://localhost/").getContentAsString(), equalTo("")); - this.webClient.getCookieManager().addCookie(new Cookie("localhost", "cookie", "cookieManagerShared")); - assertThat(getWebResponse("http://localhost/").getContentAsString(), equalTo("cookieManagerShared")); + assertThat(getResponse(client, "http://localhost/").getContentAsString(), equalTo("")); + client.getCookieManager().addCookie(new Cookie("localhost", "cookie", "cookieManagerShared")); + assertThat(getResponse(client, "http://localhost/").getContentAsString(), equalTo("cookieManagerShared")); } - private void assertMvcProcessed(String url) throws Exception { - assertThat(getWebResponse(url).getContentAsString(), equalTo("mvc")); + + private void assertMockMvcUsed(WebClient client, String url) throws Exception { + assertThat(getResponse(client, url).getContentAsString(), equalTo("mvc")); } - private void assertDelegateProcessed(String url) throws Exception { - assertThat(getWebResponse(url).getContentAsString(), not(equalTo("mvc"))); + private void assertMockMvcNotUsed(WebClient client, String url) throws Exception { + assertThat(getResponse(client, url).getContentAsString(), not(equalTo("mvc"))); } - private WebResponse getWebResponse(String url) throws IOException { - return this.webClient.getWebConnection().getResponse(new WebRequest(new URL(url))); + private WebResponse getResponse(WebClient client, String url) throws IOException { + return client.getWebConnection().getResponse(new WebRequest(new URL(url))); } diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java index 3a1bf27a373..0f2ec38b953 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/webdriver/MockMvcHtmlUnitDriverBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -17,13 +17,12 @@ package org.springframework.test.web.servlet.htmlunit.webdriver; import java.io.IOException; - import javax.servlet.http.HttpServletRequest; +import com.gargoylesoftware.htmlunit.util.Cookie; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; - import org.openqa.selenium.htmlunit.HtmlUnitDriver; import org.springframework.beans.factory.annotation.Autowired; @@ -41,11 +40,12 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import com.gargoylesoftware.htmlunit.util.Cookie; - -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import static org.springframework.test.web.servlet.htmlunit.webdriver.MockMvcHtmlUnitDriverBuilder.*; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; /** * Integration tests for {@link MockMvcHtmlUnitDriverBuilder}. @@ -68,71 +68,71 @@ public class MockMvcHtmlUnitDriverBuilderTests { private HtmlUnitDriver driver; + @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } + @Test(expected = IllegalArgumentException.class) public void webAppContextSetupNull() { - webAppContextSetup(null); + MockMvcHtmlUnitDriverBuilder.webAppContextSetup(null); } @Test(expected = IllegalArgumentException.class) public void mockMvcSetupNull() { - mockMvcSetup(null); + MockMvcHtmlUnitDriverBuilder.mockMvcSetup(null); } @Test public void mockMvcSetupWithCustomDriverDelegate() throws Exception { - WebConnectionHtmlUnitDriver preconfiguredDriver = new WebConnectionHtmlUnitDriver(); - this.driver = mockMvcSetup(this.mockMvc).withDelegate(preconfiguredDriver).build(); + WebConnectionHtmlUnitDriver otherDriver = new WebConnectionHtmlUnitDriver(); + this.driver = MockMvcHtmlUnitDriverBuilder.mockMvcSetup(this.mockMvc).withDelegate(otherDriver).build(); - assertMvcProcessed("http://localhost/test"); - Assume.group(TestGroup.PERFORMANCE, () -> assertDelegateProcessed("http://example.com/")); + assertMockMvcUsed("http://localhost/test"); + Assume.group(TestGroup.PERFORMANCE, () -> assertMockMvcNotUsed("http://example.com/")); } @Test public void mockMvcSetupWithDefaultDriverDelegate() throws Exception { - this.driver = mockMvcSetup(this.mockMvc).build(); + this.driver = MockMvcHtmlUnitDriverBuilder.mockMvcSetup(this.mockMvc).build(); - assertMvcProcessed("http://localhost/test"); - Assume.group(TestGroup.PERFORMANCE, () -> assertDelegateProcessed("http://example.com/")); + assertMockMvcUsed("http://localhost/test"); + Assume.group(TestGroup.PERFORMANCE, () -> assertMockMvcNotUsed("http://example.com/")); } @Test public void javaScriptEnabledByDefault() { - this.driver = mockMvcSetup(this.mockMvc).build(); - + this.driver = MockMvcHtmlUnitDriverBuilder.mockMvcSetup(this.mockMvc).build(); assertTrue(this.driver.isJavascriptEnabled()); } @Test public void javaScriptDisabled() { - this.driver = mockMvcSetup(this.mockMvc).javascriptEnabled(false).build(); - + this.driver = MockMvcHtmlUnitDriverBuilder.mockMvcSetup(this.mockMvc).javascriptEnabled(false).build(); assertFalse(this.driver.isJavascriptEnabled()); } - // SPR-14066 - @Test + @Test // SPR-14066 public void cookieManagerShared() throws Exception { - WebConnectionHtmlUnitDriver delegateDriver = new WebConnectionHtmlUnitDriver(); + WebConnectionHtmlUnitDriver otherDriver = new WebConnectionHtmlUnitDriver(); this.mockMvc = MockMvcBuilders.standaloneSetup(new CookieController()).build(); - this.driver = mockMvcSetup(this.mockMvc) - .withDelegate(delegateDriver) - .build(); + this.driver = MockMvcHtmlUnitDriverBuilder.mockMvcSetup(this.mockMvc) + .withDelegate(otherDriver).build(); assertThat(get("http://localhost/"), equalTo("")); - delegateDriver.getWebClient().getCookieManager().addCookie(new Cookie("localhost", "cookie", "cookieManagerShared")); + Cookie cookie = new Cookie("localhost", "cookie", "cookieManagerShared"); + otherDriver.getWebClient().getCookieManager().addCookie(cookie); assertThat(get("http://localhost/"), equalTo("cookieManagerShared")); } - private void assertMvcProcessed(String url) throws Exception { + + private void assertMockMvcUsed(String url) throws Exception { assertThat(get(url), containsString(EXPECTED_BODY)); } - private void assertDelegateProcessed(String url) throws Exception { + private void assertMockMvcNotUsed(String url) throws Exception { assertThat(get(url), not(containsString(EXPECTED_BODY))); }