我想使用mockito spy。
当我以下列两种方式设置返回值时:
when(imagesSorterSpy.sortImages(imagesAsInsertionOrder, user)).thenReturn(imagesSorterSpy.sortImages(imagesAsInsertionOrder, user, fakeNowDate));
doReturn(imagesSorterSpy.sortImages(imagesAsInsertionOrder, user, fakeNowDate)).when(imagesSorterSpy).sortImages(imagesAsInsertionOrder, user);
我看到正在急切地评估返回值
表示执行此“设置”行时。
如何强制间谍仅根据需要评估返回值?
表示满足“何时”条件。
更新
感谢@RobbyCornelissen我试过这段代码:
when(imagesSorterSpy.sortImages(imagesAsInsertionOrder, user)).thenAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
ImagesSorter mock = (ImagesSorter)invocation.getMock();
return mock.sortImages((List<Image>)args[0], (UserInfo)args[1], fakeNowDate);
}
});
但它没有帮助:
1)立即调用“when”表达式。 (不想要)
2)最终回调不是召唤。
答案 0 :(得分:2)
首先让我对部分嘲讽发出警告,因为这就是代码实际上正在做的事情,这是错误的设计明智之举。使用策略模式组成测试对象的行为可能更相关。 Mockito团队(包括我)强烈建议尽可能远离部分嘲笑。
编辑:我不知道代码,我不确切知道哪个组件正在测试中,但是我收集到的是一个负责排序图片的类型,我们称之为{{1} }。
因此,第一种情况ImagesSorter
是测试主题的依赖关系,因此在这种情况下,只需截断ImagesSorter
的模拟即可。
但是,如果ImagesSorter
本身正在测试中,并且对此类的特殊方法进行存根称为部分模拟,则它是完全错误的。它公开了测试中生产代码的内部。所以有几种解决方案。
由于答案中显示的代码段显示ImagesSorter
,其中一个解决方案是不使用fakeDate
之类的内容并编写一个简单的类new Date()
是提供日期。在测试中,可以覆盖此TimeSource
的行为。
更简单的解决方案是使用JodaTime,因为它提供了内置的此功能。
如果测试范围超出了更改日期的范围,那么TimeSOurce
可能需要一种方法来配置其他对象。可以通过番石榴的缓存构建器找到有关如何执行此操作的灵感。如果配置很简单,那么一个简单的构造函数就可以做到。
这可能看起来像:
ImagesSorter
现在关于你的问题:
1)立即调用“when”表达式。 (不想要)
预计class ImagesSorter {
ImagesSorterAlso algo;
ImagesSorter(ImagesSorterAlgo algo) { this.algo = algo; }
Iterable sortImages(...) {
algo.sort(...);
}
}
interface ImagesSorterAlgo {
Iterable sort(...);
}
是间谍,所以默认情况下它会调用真实代码。相反,您应该使用备用API,与@RobbyCornelissen显示的相同。即。
imagesSorterSpy
doAnswer(sortWithFakeDate()).when(imagesSorterSpy).sortImages(imagesAsInsertionOrder, user);
// with BDD aliases (BDDMockito) which I personnaly finds better
willAnswer(sortWithFakeDate()).given(imagesSorterSpy).sortImages(imagesAsInsertionOrder, user);
will(sortWithFakeDate()).given(imagesSorterSpy).sortImages(imagesAsInsertionOrder, user);
是一个返回答案的静态工厂方法,所以代码读得很好,可能在别处重复使用。
2)最终回调不是电话。
这个问题很可能是由于不相等的论点造成的。您可能需要检查sortWithFakeDate()
方法。或者使用equals
匹配器放松存根。
答案 1 :(得分:1)
我不知道您正在使用的参数和类的类型,因此我无法提供完整的示例,但您可以使用Answer<T>
接口使用回调来存根:
Mockito.doAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
ImagesSorter mock = (ImagesSorter) invocation.getMock();
Object[] args = invocation.getArguments();
return mock.sortImages((List<Image>) args[0], (UserInfo) args[1],
fakeNowDate);
}
}).when(imagesSorterSpy).sortImages(imagesAsInsertionOrder, user);