如何使用Mockito Mock构造函数的Optional类型@Autowired字段
Mockito构造函数注入Optional类型字段的解决方法
问题原因
@InjectMocks 仅支持注入与构造函数参数类型完全匹配的Mock对象:你当前Mock的是List<BatchInputExecutor>类型,但构造函数需要的是Optional<List<BatchInputExecutor>>,类型不匹配导致该参数无法被自动注入,默认赋值为null。
解决方法
推荐优先使用手动实例化方案,完全规避@InjectMocks的泛型匹配坑:
- 方案1:手动构造测试对象
放弃@InjectMocks注解,直接调用构造函数传入包装好的Optional参数,适合绝大多数场景:@Mock BatchInputContentRepository batchInputContentRepository; BatchInputManager batchInputManager; @BeforeEach void init() { // 构造包含自定义实现类的Executor列表 List<BatchInputExecutor> executors = new ArrayList<>(); executors.add(new 你自定义的BatchInputExecutor实现类()); // 手动包装为Optional传入构造函数 batchInputManager = new BatchInputManager(batchInputContentRepository, Optional.of(executors)); } - 方案2:直接Mock Optional类型参数
如果你需要对Optional本身做Stub逻辑,可以直接定义对应类型的Mock对象:@InjectMocks BatchInputManager batchInputManager; @Mock BatchInputContentRepository batchInputContentRepository; @Mock Optional<List<BatchInputExecutor>> batchInputExecutors; @Mock List<BatchInputExecutor> executors; @BeforeEach void init() { // 配置Optional的Stub行为 when(batchInputExecutors.isPresent()).thenReturn(true); when(batchInputExecutors.get()).thenReturn(executors); }
内容的提问来源于stack exchange,提问作者Mattew Eon
相关产品推荐
相关产品推荐

