如何使用Mockito对@Inject注解的Api类进行mock操作?
问题根因与调整方案
核心错误点
- 未初始化Mockito注解,也未将Mock实例注入到被测试业务类的
@Inject字段中,导致业务类中引用的MemberApi始终为null thenReturn语法错误:anyObject()是参数匹配器,仅可用于when的入参匹配逻辑,不能作为返回值使用,必须返回具体的实例对象- 业务代码疑似笔误:你贴出的业务代码中调用的是
MemberApi.addMember()(大写开头,属于类静态方法调用),但声明的注入字段是成员变量memberApi(小写开头),如果实际为静态方法调用,需要额外用Mockito-inline依赖实现静态方法Mock,以下方案默认你是笔误,实际调用的是注入的成员变量memberApi.addMember()
具体调整步骤
1. 引入必要依赖(JUnit5环境示例)
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency>
2. 测试类代码调整(自动注入方案)
用@ExtendWith开启Mockito注解支持,通过@InjectMocks自动将Mock对象注入到被测试类的对应字段中:
// 开启Mockito扩展 @ExtendWith(MockitoExtension.class) public class 你的业务类Test { // 要测试的业务类,Mockito会自动将@Mock对象注入到它的@Inject字段里 @InjectMocks private 你的业务类 businessService; @Mock private MemberApi mockedMemberApi; @Test public void testAddMember() { // 1. 构造模拟返回的实例 NewMember mockReturnMember = new NewMember(); // 按需设置返回值的属性 mockReturnMember.setId(123L); // 2. 正确配置Mock逻辑 when(mockedMemberApi.addMember(any(CreateMemberParameterObj.class))).thenReturn(mockReturnMember); // 3. 执行业务方法测试 NewMember result = businessService.你的业务方法(); // 后续补充断言逻辑 assertNotNull(result); } }
3. 手动注入方案(无需注解扩展)
如果不想用Mockito扩展,也可以手动初始化Mock后通过反射注入到业务类:
public class 你的业务类Test { private 你的业务类 businessService; private MemberApi mockedMemberApi; @BeforeEach public void init() throws Exception { // 初始化所有@Mock对象 MockitoAnnotations.openMocks(this); businessService = new 你的业务类(); // 反射设置私有成员变量 Field memberApiField = 你的业务类.class.getDeclaredField("memberApi"); memberApiField.setAccessible(true); memberApiField.set(businessService, mockedMemberApi); } // 测试方法同上述自动注入方案的测试逻辑 }
静态方法调用适配方案
如果你业务代码中确实是调用MemberApi.addMember()静态方法,需要替换依赖为Mockito-inline实现静态Mock:
- 替换依赖
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency>
- 测试逻辑调整
@Test public void testStaticAddMember() { NewMember mockReturnMember = new NewMember(); mockReturnMember.setId(123L); // Mock静态方法 try(MockedStatic<MemberApi> mockedStatic = Mockito.mockStatic(MemberApi.class)) { mockedStatic.when(() -> MemberApi.addMember(any(CreateMemberParameterObj.class))).thenReturn(mockReturnMember); // 执行业务方法测试 NewMember result = businessService.你的业务方法(); assertNotNull(result); } }
内容的提问来源于stack exchange,提问作者Eisenbiegler
相关产品推荐
相关产品推荐

