编辑:问题前进到下面一个更具体的问题。

测试未通过,发生此失败:

Argument(s) are different! Wanted:
declColl.find(
    { "declensions" : { "$in" : [ "testtest"]}}
);
-> at cz.xxx.CzechMongoWordDeclensionsRetrieverTest.getLemmaTest(CzechMongoWordDeclensionsRetrieverTest.java:63)
Actual invocation has different arguments:
declColl.find(
    { "declensions" : { "$in" : [ "testtest"]}}
);


您可以从失败的输出中立即看到我的问题。没有区别。 toString方法可能是欺骗性的,也许equals方法为false s返回DBObject ...如下所示,我不确定如何检查,但是检查两个“ queryBuilt”是否相同DBObject个返回了true

测试很短,看起来像这样:

@InjectMocks
private CzechMongoWordDeclensionsRetriever declRetriever;
@Mock
private DBCollection declColl;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    Object[] criteria = new String[1];
    criteria[0] = "testtest";

    //mocks init
    DBCursor cur = mock(DBCursor.class);
    DBObject queryObj = QueryBuilder.start("declensions").in(criteria).get();
    when(declColl.find(queryObj)).thenReturn(cur);
    when(cur.size()).thenReturn(1);
    when(cur.next()).thenReturn(new BasicDBObject("lemma", "testtest"));
}

@Test
public void getLemmaTest() {
    Object[] criteria = new String[1];
    criteria[0] = "testtest";
    DBObject queryObj = QueryBuilder.start("declensions").in(criteria).get();

    String toTest = "testtest";
    String testResult = declRetriever.getLemma(toTest);

    verify(declColl).find(queryObj);
}


使用这样的getLemma方法:

public String getLemma(String word) {
        criteria[0] = word;
        DBObject lemmaObj = QueryBuilder.start("declensions").in(criteria).get();
        DBCursor cursor = declColl.find(lemmaObj);

        if(cursor == null)     return null;
        if(cursor.size() > 1)  return null;
        if(cursor.size() == 0) return null;

        return (String) cursor.next().get("lemma");
    }


该代码甚至没有低于if(cursor == null)部分,因为存根不起作用。我通过运行两次DBObject创建了两个不同的QueryBuilder,然后检查它们是否相等(我不知道equals Mongo DBObject的实现看起来如何-编辑:比较地图项)。

我不知道为什么会失败。

编辑:(这应该是一个新问题吗?)

我尝试了Biju Kunjummen的回答,但起初没有帮助,但是我尝试了以下操作:

    Object[] criteria = new String[1];
    criteria[0] = "testtest";
    DBObject queryObj = QueryBuilder.start("declensions").in(criteria).get();
    Object[] criteria2 = new String[1];
    criteria2[0] = "testtest";
    DBObject queryObj2 = QueryBuilder.start("declensions").in(criteria).get();
    assertTrue(queryObj.equals(queryObj2));


而断言失败。因此,我可以看到问题不在于Mockito,但是DBObjects不匹配,即使它们应该匹配。在我看来,查询是相等的。 (在下面回答):如果Map.entry的值与所比较的Object[] Object[]相同,则equals的值似乎与false相同,如果Object[]不相同参考作为比较之一。

最佳答案

可能是因为DBObject.equals(和哈希码)未正确实现,一种快速的检查方法是尝试以下操作:

DBObject queryObj1 = QueryBuilder.start("declensions").in(criteria).get();
DBObject queryObj2 = QueryBuilder.start("declensions").in(criteria).get();

assertTrue(queryObj1.equals(queryObj2))


这可能会失败,这就是Mock断言错误的原因。

10-06 04:13