假设我有两种方法,其中一种基本上是另一种方法的包装器,只需要一点额外的处理:
public class ItemRepositoryImpl implements ItemRepository {
...
@Override
public void delete(UUID itemID) {
Item item = findOne(itemID);
delete(item);
}
@Override
public void delete(Item item) {
// Do a bunch of stuff that needs a lot of tests run on it, like
// deleting from multiple data sources etc
...
}
}
为部分模拟 ItemRepositoryImpl 的 delete(UUID) 方法编写单元测试并检查 delete(UUID) 最终调用 delete(Item) 有什么问题?如果我这样做了,我就不必为每个删除方法编写一堆重复的测试了!
在 Mockito 中,我可以用这样的间谍实现这样的测试:
ItemRepository spyRepo = spy(repository); // Create the spy
when(spyRepo.findOne(itemID)).thenReturn(item); // Stub the findOne method
doNothing().when(spyRepo).delete(item); // Stub the delete(Item) method
spyRepo.delete(itemID); // Call the method under test
// Verify that the delete(Item) method was called
verify(spyRepo).delete(item);
然而,Mockito 文档强烈反对使用这种类型的部分模拟,基本上声明它应该只用于临时遗留代码和第 3 方 API。有什么更好的解决方案?