问候。
我正在嘲笑一个搜索引擎以在我的网络应用程序中进行测试。此搜索引擎返回具有不同模式的 xml 文档。架构取决于称为集合集的参数。基于集合集返回不同的模式是难以模拟的部分,因为指定集合集基本上是一种设置方法,并且是无效的。这个搜索引擎是一个外部 jar 文件,所以我不能修改 API。我必须使用所提供的东西。这是一个例子:
Engine engine = factory.getEngine();
Search search = engine.getSearch();
search.addCollectionSet(someCollectionSet);
SearchResult result = search.getSearchResult();
Document[] documents = result.getAllDocuments();
然后对于每个文档,我可以通过调用获取 xml:
document.getDocumentText();
当我使用我的模拟对象时,getDocumentText()
返回一个由生成器创建的符合架构的 xml 字符串。我想要做的是使用不同类型的生成器,具体取决于上面第一个代码片段的步骤 3 中提供的集合集。我一直在尝试做这样的事情:
doAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
if (args == "foo") {
SearchResult result = getMockSearchResult();
when(search.getSearchResult()).thenReturn(result);
}
}
}).when(search.addCollectionSet(anyString()));
但这会导致大量红色突出显示:)
基本上,我的目标是关闭,addCollectionSet(someCollectionSet)
以便在调用它时,我可以关闭参数并确保使用不同的生成器。有谁知道我怎么能完成这样的事情?或者是否有某种形式的依赖注入可以用来有条件地连接我的生成器?
谢谢!
更新
我已经更改了我的工厂对象,使其永远不会返回引擎,而是来自该引擎的 Search 和 Find 对象,所以现在我可以执行以下操作:
Search search = factory.getSearch(collectionSet);
所以我想做的是这样的:
when(factory.getSearch(anyString()).thenAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
switch(args[0]) {
case fooSet: return fooSearch; break;
case barSet: return barSearch; break;
换句话说,我仍然想关闭在 switch 语句中传递给 getSearch 的字符串。诚然,我可以做一些更像菲利克斯在下面建议的事情,但我宁愿把我所有的箱子都包在一个开关里。有人可以提供一个如何做到这一点的例子吗?谢谢!
更新
我已经看到您可以捕获传递给模拟调用的参数,但是这些捕获的参数用于以后的断言。我还没有看到一种方法可以关闭这些参数,以便对我的模拟的调用将根据参数返回不同的值。似乎必须有一种方法可以做到这一点,我只是没有足够的 Mockito 经验来解决这个问题。但肯定有人这样做!