From 09548c08742b670de3b228760cafde6efe1608bd Mon Sep 17 00:00:00 2001 From: jungh8n Date: Mon, 24 Aug 2026 23:14:11 +0900 Subject: [PATCH] Upgrade HtmlUnit and Selenium dependencies HtmlUnit 5 moved its Cookie type to org.htmlunit.http, so Spring Test's HtmlUnit integration now uses the new API. Constraint: Keep HtmlUnit and htmlunit3-driver versions compatible. Rejected: Upgrade HtmlUnit alone | driver requires HtmlUnit 5.4.0. Confidence: high Scope-risk: narrow Directive: Keep HtmlUnit and the driver version aligned. Tested: JAVA_HOME=/opt/homebrew/opt/openjdk@25 ./gradlew build Not-tested: None Signed-off-by: jungh8n --- framework-platform/framework-platform.gradle | 6 +++--- .../servlet/htmlunit/HtmlUnitRequestBuilder.java | 8 ++++---- .../servlet/htmlunit/MockMvcWebConnection.java | 16 +++------------- .../htmlunit/HtmlUnitRequestBuilderTests.java | 2 +- .../htmlunit/MockMvcWebClientBuilderTests.java | 2 +- .../MockMvcHtmlUnitDriverBuilderTests.java | 2 +- 6 files changed, 13 insertions(+), 23 deletions(-) diff --git a/framework-platform/framework-platform.gradle b/framework-platform/framework-platform.gradle index 38bc20780277..db7fbb403d12 100644 --- a/framework-platform/framework-platform.gradle +++ b/framework-platform/framework-platform.gradle @@ -123,7 +123,7 @@ dependencies { api("org.hibernate.orm:hibernate-core:7.4.5.Final") api("org.hibernate.validator:hibernate-validator:9.1.3.Final") api("org.hsqldb:hsqldb:2.7.4") - api("org.htmlunit:htmlunit:4.21.0") + api("org.htmlunit:htmlunit:5.4.0") api("org.javamoney:moneta:1.4.4") api("org.jboss.logging:jboss-logging:3.6.1.Final") api("org.jruby:jruby:10.0.2.0") @@ -134,8 +134,8 @@ dependencies { api("org.python:jython-standalone:2.7.4") api("org.quartz-scheduler:quartz:2.3.2") api("org.reactivestreams:reactive-streams:1.0.4") - api("org.seleniumhq.selenium:htmlunit3-driver:4.41.0") - api("org.seleniumhq.selenium:selenium-java:4.41.0") + api("org.seleniumhq.selenium:htmlunit3-driver:4.47.0") + api("org.seleniumhq.selenium:selenium-java:4.47.0") api("org.skyscreamer:jsonassert:1.5.3") api("org.testng:testng:7.12.0") api("org.webjars:webjars-locator-lite:1.1.0") diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java index 6c7351c6c815..4b0e740de00a 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java @@ -293,8 +293,8 @@ private void cookies(MockHttpServletRequest request) { } } - Set managedCookies = this.webClient.getCookies(this.webRequest.getUrl()); - for (org.htmlunit.util.Cookie cookie : managedCookies) { + Set managedCookies = this.webClient.getCookies(this.webRequest.getUrl()); + for (org.htmlunit.http.Cookie cookie : managedCookies) { processCookie(request, cookies, new Cookie(cookie.getName(), cookie.getValue())); } @@ -343,8 +343,8 @@ private void removeSessionCookie(MockHttpServletRequest request, String sessioni this.webClient.getCookieManager().removeCookie(createCookie(request, sessionid)); } - private org.htmlunit.util.Cookie createCookie(MockHttpServletRequest request, String sessionid) { - return new org.htmlunit.util.Cookie(request.getServerName(), "JSESSIONID", sessionid, + private org.htmlunit.http.Cookie createCookie(MockHttpServletRequest request, String sessionid) { + return new org.htmlunit.http.Cookie(request.getServerName(), "JSESSIONID", sessionid, request.getContextPath() + "/", null, request.isSecure(), true); } 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 2d57576cd3f9..4fd0ba5ee79f 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 @@ -21,13 +21,12 @@ import java.util.HashMap; import java.util.Map; -import org.apache.http.impl.cookie.BasicClientCookie; import org.htmlunit.CookieManager; import org.htmlunit.WebClient; import org.htmlunit.WebConnection; import org.htmlunit.WebRequest; import org.htmlunit.WebResponse; -import org.htmlunit.util.Cookie; +import org.htmlunit.http.Cookie; import org.jspecify.annotations.Nullable; import org.springframework.mock.web.MockHttpServletResponse; @@ -179,22 +178,13 @@ private void storeCookies(WebRequest webRequest, jakarta.servlet.http.Cookie[] c } } - @SuppressWarnings("removal") private static Cookie createCookie(jakarta.servlet.http.Cookie cookie) { Date expires = null; if (cookie.getMaxAge() > -1) { expires = new Date(System.currentTimeMillis() + cookie.getMaxAge() * 1000); } - BasicClientCookie result = new BasicClientCookie(cookie.getName(), cookie.getValue()); - result.setDomain(cookie.getDomain()); - result.setComment(cookie.getComment()); - result.setExpiryDate(expires); - result.setPath(cookie.getPath()); - result.setSecure(cookie.getSecure()); - if (cookie.isHttpOnly()) { - result.setAttribute("httponly", "true"); - } - return new Cookie(result); + return new Cookie(cookie.getDomain(), cookie.getName(), cookie.getValue(), cookie.getPath(), + expires, cookie.getSecure(), cookie.isHttpOnly()); } @Override diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java index a383be1af524..310732648e58 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilderTests.java @@ -885,7 +885,7 @@ void mergeDoesNotCorruptPathInfoOnParent() throws Exception { private void assertSingleSessionCookie(String expected) { - org.htmlunit.util.Cookie jsessionidCookie = webClient.getCookieManager().getCookie("JSESSIONID"); + org.htmlunit.http.Cookie jsessionidCookie = webClient.getCookieManager().getCookie("JSESSIONID"); if (expected == null || expected.contains("Expires=Thu, 01-Jan-1970 00:00:01 GMT")) { assertThat(jsessionidCookie).isNull(); return; 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 610413675ea9..74af75998bf7 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 @@ -25,7 +25,7 @@ import org.htmlunit.WebClient; import org.htmlunit.WebRequest; import org.htmlunit.WebResponse; -import org.htmlunit.util.Cookie; +import org.htmlunit.http.Cookie; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Configuration; 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 3ec72efde6d4..edc65108f3dc 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 @@ -17,7 +17,7 @@ package org.springframework.test.web.servlet.htmlunit.webdriver; import jakarta.servlet.http.HttpServletRequest; -import org.htmlunit.util.Cookie; +import org.htmlunit.http.Cookie; import org.junit.jupiter.api.Test; import org.openqa.selenium.htmlunit.HtmlUnitDriver;