首页 > 解决方案 > 关于@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 任务。

标签: javamockito

解决方案


一切正常,但您对@InjectMocks.
实际上,用它注释字段不会像您想象的那样创建模拟对象。
相反,它将尝试将模拟依赖项注入到注释所在的字段所引用的对象中。
请注意,这种注入依赖项的方式并不明确,因此不会记录要在测试中模拟的依赖项。
此外,如果依赖注入失败,Mockito 不会报告任何失败。


推荐阅读