测试中Mock VertexGetTaxResilience对象后出现NullPointerException如何解决?
修复Mock重试对象时的空指针异常
错误原因分析
- 你手动将
@Mock注解的vertexGetTaxResilience赋值为null,同时注释掉了创建Mock实例的mock[VertexGetTaxResilience]代码,导致vertexGetTaxResilienceMock变量为null,调用doReturn(...).when(vertexGetTaxResilienceMock)时触发空指针。 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实例; - 必须先Mock
retryRegistry并配置其行为,因为VertexGetTaxResilience初始化时会调用retryRegistry的方法,否则会在实例创建阶段触发空指针。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

