You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:47:18