-
springboot版本:1.5.9
-
mockito版本:1.10.19
问题的表现:
在写单元测试的时候,我们有时候需要使用假的数据来确保单元测试覆盖率达标,这时我们可能会对以下注解,结合使用,确保达到自己想要的效果(具体如何使用不再介绍)。
@Mock
@InjectMocks
@Autowired
但是我在实际写单元测试的过程过程中,发现加了
@Mock
的bean,并不一定能注入到@InjectMocks
的bean中。也就是说有时候是能注入,有时候却注入不了。
问题的原因:
通过debug发现,正常注入的时候,产生的对象是平常的对象(也就是new出来的对象);
而无法注入的时候,产生的对象,这是动态代理对象(jdk动态代理或者cglib出来的对象)。正是这个区别,导致了上述问题。
那spring的ioc,什么时候会产生代理对象呢?
如果某个bean使用了AOP增强(比如加了@Transactional
的类),那么该bean对象的对象,就是代理产生的。
详细解释
解决的方案:
1.给使用
@InjectMocks
的类中成员属性,加上set方法(也可以使用lombok
的@Setter
注解)
2.另一种解决方案
(该方案要看底层我没太仔细看,大概看了一下,感觉挺靠谱哈哈哈)
3.使用单元测试中的一个工具类(
import org.springframework.test.util.ReflectionTestUtils;
),手动注入,如下(其中,bService是aService中的一个成员属性):
ReflectionTestUtils.setField(aService, "bService", bService);
网友评论