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

使用@Spy注解时出现NullPointerException问题求助

解决Mockito @Spy注解导致的NullPointerException问题

你遇到的java.lang.NullPointerException: Cannot read the array length because "elementData" is null错误,是因为使用@Spy注解直接初始化ArrayList时,Mockito的代理机制没有正确处理对象内部状态导致的。以下是几种可行的解决方法:

解决方法1:修改@Spy的初始化方式

不在字段声明时直接初始化,而是在测试前置方法中通过Mockito.spy()创建spy对象:

package com.tddk.junit.service;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.ArrayList;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;

@Slf4j
@ExtendWith(MockitoExtension.class)
public class StudentServiceTest {
    @Spy
    List<String> spyList;

    @BeforeEach
    void setUp() {
        spyList = spy(new ArrayList<>());
    }

    @Test
    void whenUsingTheSpyAnnotation_thenObjectIsSpied() {
        spyList.add("one");
        spyList.add("two");

        verify(spyList).add("one");
        verify(spyList).add("two");

        assertThat(spyList).hasSize(2);
    }
}

解决方法2:直接在测试方法中创建Spy对象

完全避开字段级别的@Spy注解,在测试方法内直接初始化spy对象:

@Test
void whenUsingTheSpyAnnotation_thenObjectIsSpied() {
    List<String> spyList = spy(new ArrayList<>());
    spyList.add("one");
    spyList.add("two");

    verify(spyList).add("one");
    verify(spyList).add("two");

    assertThat(spyList).hasSize(2);
}

解决方法3:升级Mockito版本

如果你的Mockito版本较旧,可能存在注解处理的bug,升级到最新稳定版(如5.x系列)可以解决这类兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:20:15