我可以只模拟一个方法而不是每个对象吗?

Can I mock only one method instead of every object?

我确实有关于使用 mockito 的问题。 假设我有以下需要模拟的方法链。

mockHeroFacade.getHero().getItems().getSword().getId(),所以我测试的方法只需要Sword对象的Id。 直到知道,每当我有这种链条时,我都有两种不同的方法。

  1. 是模拟@Mock HeroFacade mockHeroFacadewhen(mockHeroFacade.getHero()).thenReturn(createFullHero()),所以createFullHero返回的是完整的Hero对象和Items对象,它包含包含其ID的Sword对象。这没关系,但如果对象更大,则需要一些时间
  2. 不仅是分别模拟每个对象HeroFacade

如下图

class TestHero {
    @Mock 
    HeroFacade mockHeroFacade;
    @Mock 
    Hero mockHero;
    @Mock 
    Items mockItems;
    @Mock 
    Sword mockSword;

    @Before
    public void setup(){
        when(mockHeroFacade.getHero()).thenReturn(mockHero);
        when(mockHero.getItems()).thenReturn(mockItems);
        when(mockItems.getSword()).thenReturn(mockSword);
        when(mockItems.getId()).thenReturn(100000);
    }
}

这种方法也有效,但仍然很麻烦,需要编写大量代码。

而且我想知道我是否可以走捷径并执行以下操作: when(mockHeroFacade.getHero().getItems().getSword().getId()).thenReturn(10000)

我找到了答案。

可以使用 RETURNS_DEEP_STUBS,它告诉 mockito 进行深度模拟。

@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private MockHeroFacade mockHeroFacade;

这使您可以进行链式调用。