1

问候。

我正在嘲笑一个搜索引擎以在我的网络应用程序中进行测试。此搜索引擎返回具有不同模式的 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 经验来解决这个问题。但肯定有人这样做!

4

1 回答 1

1

我建议将对遗留代码的调用包装到您自己的对象中。所以你最终得到了你自己的方法:

class SearchEngineWrapper {
  public String getSearchResult(String collection){
    Engine engine = factory.getEngine();
    Search search = engine.getSearch();
    search.addCollectionSet(someCollectionSet);
    SearchResult result = search.getSearchResult();
    ...
    return document.getDocumentText();
  }
}

现在你可以模拟出这个方法了。该方法还很好地记录了您的意图。您也可以在集成测试中测试实际实现。

when(searchEngineWrapper.getSearchResult("abc").thenReturn("foo");
when(searchEngineWrapper.getSearchResult("xyz").thenReturn("bar");
于 2010-12-02T18:25:16.060 回答