使用Mockito模拟接口与最终类:Example类单元测试问题
解决方案
要模拟这个第三方Client的调用,你可以用Mockito的**spy(间谍)**来部分替换Example类的getClient()方法行为,让它返回你预先mock好的Client实例,具体步骤如下:
1. 调整测试类依赖与初始化
首先需要mock一个Client实例,同时用spy创建Example的间谍对象(而非直接new),这样可以篡改getClient()的返回值,完全隔离第三方依赖。
2. 完整测试代码示例
import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import java.util.Collections; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ExampleTest { private Example example; @Mock private Client mockClient; // 模拟第三方Client实例 @Before public void setup() { example = Mockito.spy(new Example()); // 创建Example的间谍实例 // 让getClient()方法返回我们预先mock好的Client when(example.getClient()).thenReturn(mockClient); } @Test public void testGetData() { // 定义mockClient的行为:传入"TestId"时返回空集合 Set<Data> expectedEmptySet = Collections.emptySet(); when(mockClient.getData("TestId")).thenReturn(expectedEmptySet); // 调用被测方法 Set<Data> actualData = example.getData("TestId"); // 断言结果符合预期 assertEquals(expectedEmptySet, actualData); } }
关键说明
- Spy的核心作用:Spy会保留原类的绝大部分逻辑,仅替换我们指定的方法(这里就是
getClient()),不用修改原业务代码结构,也完全规避了ClientFactory、云认证配置这些外部依赖。 - Mock行为的定义:通过
when(mockClient.getData("TestId")).thenReturn(...)预先设定调用预期,确保测试只验证Example类自身的逻辑正确性,不受第三方库或外部服务的影响。
内容的提问来源于stack exchange,提问作者AYa
相关产品推荐
相关产品推荐

