AEM Servlet中Gson反序列化的JUnit5测试问题求助
问题解决与JUnit5测试方案
一、解决Gson的NoSuchMethodError错误
这个错误是Gson版本冲突或依赖不完整导致的,解决步骤:
- 统一项目运行环境与测试环境的Gson版本,推荐使用稳定版如
2.10.1 - Maven项目在
pom.xml中明确指定版本并排除冲突依赖:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <scope>test</scope> </dependency>
- Gradle项目强制统一版本:
configurations.all { resolutionStrategy.force 'com.google.code.gson:gson:2.10.1' }
二、编写JUnit5测试用例覆盖目标代码
使用Mockito配合JUnit5实现Mock测试,以下是完整方案:
1. 测试依赖(Maven)
确保引入JUnit5、Mockito及Sling API测试包:
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.api</artifactId> <version>2.26.0</version> <scope>test</scope> </dependency>
2. 测试类代码(覆盖目标映射逻辑)
import com.google.gson.Gson; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.apache.sling.api.SlingHttpServletRequest; import java.io.BufferedReader; import java.io.StringReader; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class YourServletTest { // 替换为你的SlingPostServlet实际类名 @Mock private SlingHttpServletRequest req; @Test void testIdDetailsMapping() throws Exception { // 构造测试JSON数据 String testJson = "{\"fb\":\"test-fb-id\",\"gd\":\"test-gd-id\",\"apple\":\"test-apple-id\"}"; // Mock请求的Reader返回测试JSON when(req.getReader()).thenReturn(new BufferedReader(new StringReader(testJson))); // 执行目标映射代码 IdDetails idDetails = new Gson().fromJson(req.getReader(), IdDetails.class); // 验证映射结果 assertEquals("test-fb-id", idDetails.getFb()); assertEquals("test-gd-id", idDetails.getGd()); assertEquals("test-apple-id", idDetails.getApple()); } }
3. 完整测试Servlet的doPost方法
如果需要覆盖整个doPost流程:
import com.google.gson.Gson; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import java.io.BufferedReader; import java.io.StringReader; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class YourServletTest { @Mock private SlingHttpServletRequest req; @Mock private SlingHttpServletResponse resp; @Test void testDoPost() throws Exception { // 构造测试JSON String testJson = "{\"fb\":\"fb123\",\"gd\":\"gd456\",\"apple\":\"apple789\"}"; when(req.getReader()).thenReturn(new BufferedReader(new StringReader(testJson))); // 实例化Servlet并调用doPost YourServlet servlet = new YourServlet(); // 替换为你的Servlet类名 servlet.doPost(req, resp); // 可添加后续逻辑验证,如Mock依赖的调用情况 } }
关键说明
@ExtendWith(MockitoExtension.class):JUnit5与Mockito整合的核心注解,用于初始化Mock对象when(req.getReader()).thenReturn(...):模拟请求输入流,让Gson能读取到预设的JSON数据完成映射- 断言部分用于验证对象属性映射是否符合预期,确保代码逻辑正确性
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

