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

Mockito模拟测试时出现NullPointerException问题求助

排查Mockito模拟失效导致NullPointerException的问题

我之前也踩过类似的Mockito坑,明明配置了模拟却还是触发空指针,咱们一步步拆解可能的原因:

1. 参数匹配不匹配是最常见的诱因

你模拟kjidR048.executeAddDocuments(requestAdd)时用了具体的requestAdd对象,但Mockito默认通过equals()方法匹配参数。如果RequestAdd类没重写equals()和hashCode(),或者业务代码里调用executeAddDocuments时传入的对象和测试代码里的requestAdd不是同一个实例,这个模拟就不会触发——executeAddDocuments会返回默认的null,调用getReturnCode()自然就空指针了。

解决办法:

  • 不需要精确匹配参数时,用any()匹配任意类型:
    Mockito.when(kjidR048.executeAddDocuments(Mockito.any(RequestAdd.class))).thenReturn(responseSrvAdd);
    
  • 需要精确匹配时,要么给RequestAdd重写equals()和hashCode(),要么用eq()显式指定匹配:
    Mockito.when(kjidR048.executeAddDocuments(Mockito.eq(requestAdd))).thenReturn(responseSrvAdd);
    

2. Mock对象没被正确初始化或注入

你得确认kjidR048这个依赖是被正确Mock并注入到测试类中的:

  • JUnit 4环境:要么在测试类上加@RunWith(MockitoJUnitRunner.class),要么在@Before方法里调用MockitoAnnotations.openMocks(this);
  • JUnit 5环境:要加@ExtendWith(MockitoExtension.class);
  • Spring环境:用@MockBean来MockkjidR048,或者用@InjectMocks把Mock对象注入到你要测试的业务类里。

如果kjidR048是真实实例而非Mock对象,executeAddDocuments肯定不会返回你模拟的responseSrvAdd,直接返回null就会触发空指针。

3. 模拟顺序搞反了

有没有可能你先执行了业务代码,再配置的模拟?比如:

// 错误顺序:先调用方法再模拟
service.yourBusinessMethod();
Mockito.when(kjidR048.executeAddDocuments(requestAdd)).thenReturn(responseSrvAdd);

Mockito的模拟必须在方法调用之前配置好,不然第一次调用会返回默认值(对象类型为null)。

修正后的测试代码示例

给你一个标准的Mockito测试模板,你可以对照调整:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.*;

public class YourBusinessServiceTest {

    @Mock
    private KjidR048 kjidR048; // 要Mock的依赖类

    @InjectMocks
    private YourBusinessService serviceUnderTest; // 你要测试的业务类

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this); // 初始化所有Mock对象
    }

    @Test
    void testAddDocumentsSuccess() {
        // 1. 准备测试参数
        RequestAdd requestAdd = new RequestAdd();
        // 给requestAdd设置必要属性

        // 2. Mock返回对象
        ResponseSrvAddDto mockResponse = mock(ResponseSrvAddDto.class);
        when(mockResponse.getReturnCode()).thenReturn("00");

        // 3. 配置Mock方法调用
        when(kjidR048.executeAddDocuments(any(RequestAdd.class))).thenReturn(mockResponse);

        // 4. 执行业务方法
        serviceUnderTest.yourAddDocumentMethod(requestAdd);

        // 5. 验证方法调用(可选但推荐)
        verify(kjidR048, times(1)).executeAddDocuments(requestAdd);
    }
}

按照上面的步骤排查,应该能解决你的空指针问题。

内容的提问来源于stack exchange,提问作者Frusciante xd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:32:39