java - 关于@Service Spring Boot 中的@Spy 和@InjectMocks 的说明
问题描述
好吧,我对@Spy 和@Mock 很困惑。据我了解,@Spy 将调用真正的方法,而 @Mock/@InjectMocks 不会,因为它只是一个模拟,如果我想改变模拟的行为,我需要一个存根(when.thenReturn)。
在我的测试类中,我有以下代码:
@RunWith(MockitoJUnitRunner.class)
public class CaixaServiceTest {
@InjectMocks
private CaixaService caixaService;
@Mock
private CaixaRepository caixaRepository;
所以,CaixaRepository 是 Spring Data 的 JpaRepository 接口,CaixaService 只是有一个非常简单的方法:
public void calcular(){
int a = (int) Math.pow(1,3);
log.info(a);
}
如果我调用caixaRepository.findOne(id)
null 应该返回,因为 findOne 从未真正调用过,因为它只是一个模拟。这个案例效果很好。
但是当我调用caixaService.calcular()
方法体时(不应该因为它是一个模拟),log.info(a)
我的文件中记录了。
我无法理解这种行为,因为正如我所说,如果存根不存在,@InjectMocks 或 @Mock 不应执行任何操作,这是一个 @Spy 任务。
解决方案
一切正常,但您对@InjectMocks
.
实际上,用它注释字段不会像您想象的那样创建模拟对象。
相反,它将尝试将模拟依赖项注入到注释所在的字段所引用的对象中。
请注意,这种注入依赖项的方式并不明确,因此不会记录要在测试中模拟的依赖项。
此外,如果依赖注入失败,Mockito 不会报告任何失败。
推荐阅读
- flutter - TextTheme 字段与 Sketch 项目文本样式不匹配
- scala - 如何找到两个数据帧的差异
- python - 如何使用 python 将某些文件从多个子目录复制到一个目标?
- css - Angular 7 - 多个类(空格)导致 ngClass 失败
- java - 如何按树形图键的长度排序,如果键的长度相等,按字母顺序排列并写入文本文件
- c# - 如何将来自 One 控件的数据绑定并绑定到源到变量 WPF、C#
- fpm - 使用 EASYBUILD 中的 FPM 选项进行打包
- oracle - 在 oracle / 学说中转换类似函数的问题
- database - Key/Value 数据库的二级索引
- python - keras 与 TensorFlow GPU、CUDA_ERROR_LAUNCH_FAILED 超参数搜索