You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:22:35