关于@Service Spring Boot中的@Spy和@InjectMocks的说明

时间:2018-11-23 17:41:54

标签: java mockito

好吧,我对@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任务。

1 个答案:

答案 0 :(得分:2)

一切正常,但您对@InjectMocks的理解。
的确,用它注释字段不会像您想象的那样创建模拟对象。
取而代之的是,它将尝试将模拟依赖项注入到注释所在字段所引用的对象中。
请注意,这种注入依赖项的方式不是显式的,因此也没有记录要在测试中模拟的依赖项。
此外,如果依赖项注入失败,Mockito将不会报告任何失败。