好吧,我对@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任务。
答案 0 :(得分:2)
一切正常,但您对@InjectMocks
的理解。
的确,用它注释字段不会像您想象的那样创建模拟对象。
取而代之的是,它将尝试将模拟依赖项注入到注释所在字段所引用的对象中。
请注意,这种注入依赖项的方式不是显式的,因此也没有记录要在测试中模拟的依赖项。
此外,如果依赖项注入失败,Mockito将不会报告任何失败。