gpt4 book ai didi

java - Mockito 测试失败 - 参数(Mongo DBObjects)不同(不是!)

转载 作者:行者123 更新时间:2023-12-02 06:21:14 24 4
gpt4 key购买 nike

编辑:问题已进入下面更具体的问题。

测试未通过,发生此故障:

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 方法为 DBObject 返回 false ......正如我所说下面,我不知道如何检查这一点,但检查两个“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) 部分,因为 stub 不起作用。我通过运行QueryBuilder两次创建了两个不同的DBObject,然后检查它们是否相等(我不知道equals的实现如何Mongo DBObject 看起来像 - 编辑:比较 map 条目)。

我不知道为什么会发生失败。

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

我尝试过 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[] 具有相同的内容 如果 Object[] 与比较对象的引用不同,则 equals 变为 false

最佳答案

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

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

assertTrue(queryObj1.equals(queryObj2))

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

关于java - Mockito 测试失败 - 参数(Mongo DBObjects)不同(不是!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20996957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com