我可以只模拟一个方法而不是每个对象吗?
Can I mock only one method instead of every object?
我确实有关于使用 mockito 的问题。
假设我有以下需要模拟的方法链。
mockHeroFacade.getHero().getItems().getSword().getId()
,所以我测试的方法只需要Sword
对象的Id
。
直到知道,每当我有这种链条时,我都有两种不同的方法。
- 是模拟
@Mock HeroFacade mockHeroFacade
和when(mockHeroFacade.getHero()).thenReturn(createFullHero())
,所以createFullHero返回的是完整的Hero对象和Items对象,它包含包含其ID的Sword对象。这没关系,但如果对象更大,则需要一些时间
- 不仅是分别模拟每个对象
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;
这使您可以进行链式调用。
我确实有关于使用 mockito 的问题。 假设我有以下需要模拟的方法链。
mockHeroFacade.getHero().getItems().getSword().getId()
,所以我测试的方法只需要Sword
对象的Id
。
直到知道,每当我有这种链条时,我都有两种不同的方法。
- 是模拟
@Mock HeroFacade mockHeroFacade
和when(mockHeroFacade.getHero()).thenReturn(createFullHero())
,所以createFullHero返回的是完整的Hero对象和Items对象,它包含包含其ID的Sword对象。这没关系,但如果对象更大,则需要一些时间 - 不仅是分别模拟每个对象
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;
这使您可以进行链式调用。