Mockito @InjectMocks对象注入上层InjectMocks对象,上层对象需要的其余的Autowired注入对象以反射形式注入
@Mock/@Spy的使用
1、useCouponCommandV2、userCouponListCacheManager、userCouponListCache里所需要的对象都显示注入。
这里userCouponListCache除了mock的方法,还需要正常调用其他方法,所以用spy,用spy得保证属性与真实对象的一致,所以用ReflectionTestUtils.setField注入
如果只用到mock掉的方法,建议使用@Mock注解,并且不需要注入内部对象
@InjectMocks
private UseCouponCommandV2 useCouponCommandV2;
@Autowired
private ShardRedisTemplate shardRedisTemplate;
@Autowired
private PernodBusSender pernodBusSender;
@Autowired
private CouponRepository couponRepository;
//......
//省略其余Autowired
@InjectMocks
// @Autowired
private UserCouponListCacheManager userCouponListCacheManager = new UserCouponListCacheManager();
@Spy
private UserCouponListCache userCouponListCache ;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
ReflectionTestUtils.setField(useCouponCommandV2, "couponRepository", couponRepository);
ReflectionTestUtils.setField(useCouponCommandV2, "couponPolicy", couponPolicy);
Ref