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

测试中Mock VertexGetTaxResilience对象后出现NullPointerException如何解决?

修复Mock重试对象时的空指针异常

错误原因分析

  1. 你手动将@Mock注解的vertexGetTaxResilience赋值为null,同时注释掉了创建Mock实例的mock[VertexGetTaxResilience]代码,导致vertexGetTaxResilienceMock变量为null,调用doReturn(...).when(vertexGetTaxResilienceMock)时触发空指针。
  2. VertexGetTaxResilience类初始化时会通过构造器传入的retryRegistry创建defaultVertexRetryInstance,如果创建实例时未正确MockretryRegistry,会因为调用retryRegistry.getConfiguration()触发空指针。

修复方案

方案一:手动创建Mock实例(Scala MockitoSugar方式)

import org.mockito.MockitoSugar._
import java.util.Optional

// 先Mock依赖的RetryRegistry和RetryConfiguration
val mockRetryRegistry = mock[RetryRegistry]
val mockRetryConfig = mock[RetryConfiguration]

// 配置RetryRegistry的行为,避免类初始化报错
when(mockRetryRegistry.getConfiguration("getVerTexTaxDefaultRetry"))
  .thenReturn(Optional.of(mockRetryConfig))
when(mockRetryConfig.get())
  .thenReturn(Retry.ofDefaults("getVerTexTaxDefaultRetry"))

// 创建VertexGetTaxResilience的Mock实例,传入Mock的retryRegistry
val vertexGetTaxResilienceMock = mock[VertexGetTaxResilience](
  withSettings().useConstructor(mockRetryRegistry)
)

// 配置Mock方法返回自定义的重试实例
val customRetry = Retry.ofDefaults("getVerTexTaxDefaultRetry")
doReturn(customRetry).when(vertexGetTaxResilienceMock).getDefaultRetryInstance()

方案二:使用@Mock注解配合测试扩展

import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.Mock
import java.util.Optional

@ExtendWith(classOf[MockitoExtension])
class YourTestClass {
    @Mock
    private var mockRetryRegistry: RetryRegistry = _
    @Mock
    private var mockRetryConfig: RetryConfiguration = _
    
    private lateinit var vertexGetTaxResilienceMock: VertexGetTaxResilience

    @org.junit.jupiter.api.BeforeEach
    def setup(): Unit = {
        // 配置RetryRegistry的行为
        when(mockRetryRegistry.getConfiguration("getVerTexTaxDefaultRetry"))
          .thenReturn(Optional.of(mockRetryConfig))
        when(mockRetryConfig.get())
          .thenReturn(Retry.ofDefaults("getVerTexTaxDefaultRetry"))
        
        // 创建Mock实例
        vertexGetTaxResilienceMock = mock[VertexGetTaxResilience](
          withSettings().useConstructor(mockRetryRegistry)
        )
        
        // 自定义重试实例并Mock方法返回
        val customRetry = Retry.ofDefaults("getVerTexTaxDefaultRetry")
        doReturn(customRetry).when(vertexGetTaxResilienceMock).getDefaultRetryInstance()
    }

    // 你的测试方法
    // @org.junit.jupiter.api.Test
    // def testMethod(): Unit = { ... }
}

关键注意点

  • 不要手动将@Mock注解的变量赋值为null,Mockito会自动注入Mock实例;
  • 必须先MockretryRegistry并配置其行为,因为VertexGetTaxResilience初始化时会调用retryRegistry的方法,否则会在实例创建阶段触发空指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:48:22