如何在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.
相关产品推荐
相关产品推荐

