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

如何在Mockito中同时注入Mock对象与真实对象?

替换Mock对象为真实实例的实现方法

要把测试中的CsvMapper从Mock实例换成真实实例,有两种简单直接的方式,适配你当前用Mockito的测试结构:

方式一:直接实例化+自动/手动注入

去掉CsvMapper上的@Mock注解,直接创建真实实例,Mockito的@InjectMocks会自动优先使用已存在的实例注入到CsvUtils中;如果自动注入失败,手动调用setter方法即可。

示例代码:

public class CsvUtilsTest {
    @Mock
    private S3Client s3Client;
    @Mock
    private S3BucketWrapper s3Buckets;
    // 直接实例化真实的CsvMapper对象
    private CsvMapper csvMapper = new CsvMapper();

    @InjectMocks
    private CsvUtils csvUtils;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
        // 若@InjectMocks未自动注入,手动调用setter(前提CsvUtils有对应set方法)
        // csvUtils.setCsvMapper(csvMapper);
    }

    @Test
    void testCsvProcessing() {
        // 执行测试逻辑
        String csvOutput = csvUtils.generateCsv(someData);
        
        // 使用真实的csvMapper解析输出,断言结果正确性
        List<YourDataClass> parsedData = csvMapper.readerFor(YourDataClass.class).readValues(csvOutput).readAll();
        assertEquals(expectedData, parsedData);
    }
}

方式二:使用@Spy注解包装真实实例

如果后续需要对CsvMapper的部分方法做Mock(当前需求不需要,但留作扩展),可以用@Spy注解包裹真实实例,默认会调用真实方法逻辑。

示例代码:

public class CsvUtilsTest {
    @Mock
    private S3Client s3Client;
    @Mock
    private S3BucketWrapper s3Buckets;
    // @Spy包装真实实例,默认执行真实方法
    @Spy
    private CsvMapper csvMapper = new CsvMapper();

    @InjectMocks
    private CsvUtils csvUtils;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    // 测试方法同上,可直接用真实逻辑断言
}

注意事项

  • 确保CsvMapper有可访问的构造方法(第三方库通常会提供无参构造),如果需要自定义配置,直接在实例化时传入参数即可。
  • 若CsvUtils中的csvMapper是私有字段且无setter,@InjectMocks会通过反射完成注入,无需额外操作。

内容的提问来源于stack exchange,提问作者Joe C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:34:57