Android中@InjectMock遇构造函数依赖引发空指针如何解决?
解决@InjectMocks遇到带参构造函数时的NullPointerException问题
兄弟,这个坑我踩过!当你用@InjectMocks注入ServerService的时候,如果它的构造函数带依赖参数,Mockito默认会优先找无参构造函数——找不到的话,要么直接报错,要么硬实例化导致构造函数里的依赖为null,触发NPE。下面给你几个实用的解决方案:
方法一:让Mockito自动注入构造函数依赖
Mockito支持自动将你mock好的依赖注入到目标类的构造函数里,只要你提前用@Mock注解构造函数里的所有依赖就行。Mockito会根据参数类型自动匹配注入,非常省心。
示例代码:
// 首先mock构造函数里需要的所有依赖类 @Mock private DatabaseClient dbClient; @Mock private ApiClient apiClient; // 用@InjectMocks注入ServerService,Mockito会自动把上面的mock传入构造函数 @InjectMocks private ServerService service; // 别忘了初始化Mockito注解! // JUnit4的话,在测试类上加: // @RunWith(MockitoJUnitRunner.class) // JUnit5的话加: // @ExtendWith(MockitoExtension.class) // 或者在@Before/@BeforeEach里手动初始化: // MockitoAnnotations.openMocks(this);
方法二:手动实例化并注入Mock依赖
如果Mockito的自动注入不符合你的需求(比如构造函数有复杂的参数匹配逻辑),那直接手动创建ServerService实例,把mock好的依赖传进去就行,这种方式最直观可控。
示例代码:
@Mock private DatabaseClient dbClient; @Mock private ApiClient apiClient; private ServerService service; @BeforeEach // JUnit5用这个,JUnit4用@Before public void setUp() { // 手动把mock依赖传入构造函数 service = new ServerService(dbClient, apiClient); }
方法三:用@Spy处理部分真实依赖
如果构造函数里的某些依赖你不想完全mock,想保留它的真实逻辑(比如一些工具类),可以用@Spy注解来包装真实实例,然后让Mockito注入进去。
示例代码:
// 用@Spy创建一个真实的实例,但可以mock它的部分方法 @Spy private ConfigLoader configLoader = new ConfigLoader("test-config.properties"); @Mock private ApiClient apiClient; @InjectMocks private ServerService service;
关键注意点
- 确保所有构造函数里的依赖都被mock/spy了,否则Mockito还是会因为找不到合适的依赖而抛出异常。
- 一定要初始化Mockito的注解,否则
@Mock和@InjectMocks都不会生效,这也是很多人踩坑的点!
内容的提问来源于stack exchange,提问作者Muhammad Waqas
相关产品推荐
相关产品推荐

