This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch fix/WW-3353-rest-test-case
in repository https://gitbox.apache.org/repos/asf/struts.git

commit d9b58cf01b31b5f5c05cbb9af560dc4c5130b77e
Author: Lukasz Lenart <[email protected]>
AuthorDate: Wed Sep 16 09:23:34 2026 +0200

    WW-3353 fix(junit): make StrutsRestTestCase work against a REST/Convention 
app
    
    StrutsRestTestCase could not run a REST action to completion:
    
    - initServletMockObjects() built the MockServletContext before
      assigning ConventionPluginResourceLoader, so the loader was a dead
      assignment and Convention could not resolve results under
      /WEB-INF/content ("No result defined for action ... and result show").
    - spring-test's MockHttpServletResponse needs spring-web, which the
      plugin only reached through its optional struts2-spring-plugin
      dependency; a project without the Spring plugin failed with
      NoClassDefFoundError: org/springframework/http/MediaType.
    
    Adds the first test of StrutsRestTestCase, in rest-showcase, executing
    GET /orders/3 through the proxy and rendering /orders/3.json. The
    showcase gets the junit plugin at test scope and the servlet/JSP APIs
    at provided scope, as apps/showcase already declares.
    
    Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
---
 apps/rest-showcase/pom.xml                         | 15 +++++++
 .../example/OrdersControllerRestTestCaseTest.java  | 47 ++++++++++++++++++++++
 plugins/junit/pom.xml                              |  4 ++
 .../apache/struts2/junit/StrutsRestTestCase.java   |  2 +-
 4 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/apps/rest-showcase/pom.xml b/apps/rest-showcase/pom.xml
index 158c522db..74131067f 100644
--- a/apps/rest-showcase/pom.xml
+++ b/apps/rest-showcase/pom.xml
@@ -67,6 +67,21 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-junit-plugin</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.servlet.jsp</groupId>
+            <artifactId>jakarta.servlet.jsp-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
 
         <dependency>
             <groupId>net.sourceforge.jwebunit</groupId>
diff --git 
a/apps/rest-showcase/src/test/java/org/demo/rest/example/OrdersControllerRestTestCaseTest.java
 
b/apps/rest-showcase/src/test/java/org/demo/rest/example/OrdersControllerRestTestCaseTest.java
new file mode 100644
index 000000000..3bd143f4f
--- /dev/null
+++ 
b/apps/rest-showcase/src/test/java/org/demo/rest/example/OrdersControllerRestTestCaseTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.demo.rest.example;
+
+import org.apache.struts2.ActionProxy;
+import org.apache.struts2.junit.StrutsRestTestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class OrdersControllerRestTestCaseTest extends 
StrutsRestTestCase<OrdersController> {
+
+    @Test
+    public void showBindsTheIdFromTheRequestPath() throws Exception {
+        ActionProxy proxy = getActionProxy("GET", "/orders/3");
+
+        assertEquals("show", proxy.getMethod());
+        proxy.execute();
+
+        OrdersController controller = (OrdersController) proxy.getAction();
+        assertEquals("Bob", ((Order) controller.getModel()).getClientName());
+    }
+
+    @Test
+    public void executeActionRendersTheOrderAsJson() throws Exception {
+        String json = executeAction("GET", "/orders/3.json");
+
+        assertTrue(json, json.contains("\"clientName\":\"Bob\""));
+    }
+}
diff --git a/plugins/junit/pom.xml b/plugins/junit/pom.xml
index 332296d97..361b23ffc 100644
--- a/plugins/junit/pom.xml
+++ b/plugins/junit/pom.xml
@@ -44,6 +44,10 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-spring-plugin</artifactId>
diff --git 
a/plugins/junit/src/main/java/org/apache/struts2/junit/StrutsRestTestCase.java 
b/plugins/junit/src/main/java/org/apache/struts2/junit/StrutsRestTestCase.java
index ebfd95a97..0112e6b8d 100644
--- 
a/plugins/junit/src/main/java/org/apache/struts2/junit/StrutsRestTestCase.java
+++ 
b/plugins/junit/src/main/java/org/apache/struts2/junit/StrutsRestTestCase.java
@@ -136,10 +136,10 @@ public class StrutsRestTestCase<T> extends 
StrutsJUnit4TestCase<T> {
 
     @Override
     protected void initServletMockObjects() {
+        resourceLoader = new ConventionPluginResourceLoader();
         servletContext = new MockServletContext(resourceLoader);
         response = new MockHttpServletResponse();
         request = new MockHttpServletRequest();
         pageContext = new MockPageContext(servletContext, request, response);
-        resourceLoader = new ConventionPluginResourceLoader();
     }
 }

Reply via email to