使用@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
相关产品推荐
相关产品推荐

