Mockito.when.thenReturn 空指针问题

本文介绍了在使用Mockito进行单元测试时遇到的空指针异常问题。当使用anyObject()作为方法参数时,可能会导致预期返回值错误。通过指定参数类型,如anyInt(), anyString()等,可以正确匹配方法调用,从而避免空指针异常。此方法对于多参数且类型不同的情况尤其关键,确保了测试的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写mockit 单测时候,之前为了省事 when 的方法入参,一律使用anyObject() ,但是问题就出来了,mock方法直接空指针异常

排查了很久,看了这篇文档,

https://blog.youkuaiyun.com/weixin_44388689/article/details/113757617

才知道,when 的方法 参数多种类型时,要指定类型,否则预期返回值就有问题,我的参数类似这种 method(0,10,"name")   ,原始写法 method(anyObject(),anyObject(),anyObject())  这种会报空指针,

改成method(anyint(),anyint(),anyString()) 才解决

Error in testFeatureDozeTimeout_suspend_postsDelayedRunnable(com.huanglong.imstandbyservice.ImStandbyServiceTest):java.lang.NullPointerException: Attempt to invoke interface method 'boolean org.mockito.plugins.MockMaker$TypeMockability.mockable()' on a null object reference at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:23) at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:238) at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.java:226) at org.mockito.internal.MockitoCore.mock(MockitoCore.java:68) at org.mockito.Mockito.mock(Mockito.java:1905) at org.mockito.internal.configuration.MockAnnotationProcessor.processAnnotationForMock(MockAnnotationProcessor.java:41) at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:19) at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16) at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38) at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62) at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:57) at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41) at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69) at com.huanglong.imstandbyservice.ImStandbyServiceTest.setUp(ImStandbyServiceTest.java:158)
最新发布
07-31
public <T extends ViewModel> T getApplicationScopeViewModel(@NonNull Class<T> modelClass) { if (mApplicationProvider == null) mApplicationProvider = new ViewModelProvider(ApplicationInstance.getInstance()); return mApplicationProvider.get(modelClass); } package com.st.base.ui; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.mockito.PowerMockito.whenNew; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockedStatic; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(ApplicationInstance.class) public class ViewModelScopeTest2 { private ViewModelScope viewModelScope; @Before public void setUp() { viewModelScope = new ViewModelScope(); } @Test public void testGetApplicationScopeViewModel_CreatesProvider() throws Exception { PowerMockito.mockStatic(ApplicationInstance.class); ApplicationInstance mockApplication = mock(ApplicationInstance.class); when(ApplicationInstance.getInstance()).thenReturn(mockApplication); ViewModelProvider mockProvider = mock(ViewModelProvider.class); whenNew(ViewModelProvider.class).withArguments(mockApplication).thenReturn(mockProvider); // 3. 调用方法 viewModelScope.getApplicationScopeViewModel(TestViewModel.class); // 4. 验证 mApplicationProvider 被赋值 // assertNotNull(viewModelScope.mApplicationProvider); } // 示例 ViewModel static class TestViewModel extends ViewModel { } } mApplicationProvider = new ViewModelProvider(ApplicationInstance.getInstance()); 在这个地方打桩失败, whenNew(ViewModelProvider.class).withArguments(mockApplication).thenReturn(mockProvider); 导致 mApplicationProvider.get(modelClass); 这里出现空指针异常,给出具体的解决方案
07-25
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值