美文网首页
springboot单元测试时@InjectMocks失效

springboot单元测试时@InjectMocks失效

作者: 侧耳倾听y | 来源:发表于2020-06-07 19:25 被阅读0次
  • 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);

相关文章

网友评论

      本文标题:springboot单元测试时@InjectMocks失效

      本文链接:https://www.haomeiwen.com/subject/opfhtktx.html