Junit测试CodeRepository时触发NullPointerException问题排查
JPA仓库测试空指针异常排查
仓库代码
待测试的CodeRepository接口,包含findByCode等自定义查询方法:
public interface CodeRepository extends JpaRepository<CodeEntity, Integer> { CodeEntity findByCode(String code); CodeEntity findByCodeIgnoreCaseAndCodeType(String code, String codeType); }
编写的JUnit测试用例
@DataJpaTest public class CodeRepositoryTest { @Autowired CodeRepository codeRepository; final TestData testData = new TestData(); @Test public void testRepository() { final CodeEntity codeEntity = testData.getCodeEntity(); // 确认codeEntity不为空 codeRepository.save(codeEntity); // 此处触发空指针异常 } }
堆栈跟踪信息
java.lang.NullPointerException at com.oversighttech.ocr.dao.repository.CodeRepositoryTest.testRepository(CodeRepositoryTest.java:29) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
问题原因及解决方法
- 核心原因:
codeRepository未被Spring容器成功注入,调用save方法时触发空指针。 - 解决步骤:
- 若使用JUnit 4,必须给测试类添加
@RunWith(SpringRunner.class)注解,否则Spring无法完成Bean自动注入:@RunWith(SpringRunner.class) @DataJpaTest public class CodeRepositoryTest { // 原有代码保持不变 } - 确认测试类所在包路径在Spring组件扫描范围内,或通过
@ComponentScan指定扫描路径。 - 检查
CodeRepository接口是否被@Repository注解标记(Spring Data JPA会自动代理接口,但显式标记可避免扫描遗漏)。 - 确保
spring-boot-starter-test依赖完整,包含Spring Data JPA的测试支持模块。
- 若使用JUnit 4,必须给测试类添加
内容的提问来源于stack exchange,提问作者shreyash
相关产品推荐
相关产品推荐

