将Mockito增强类与常规类进行比较

时间:2018-11-13 12:36:52

标签: java mocking mockito

我用两个字段创建了一个简单的测试类,

@Mock
private MyTestClass myTestClass;

@Spy
private final MyContext context = CommonTestData.getDefaultContext();

基本上,我在这里实际上不需要间谍功能,它只是用于自动将对象注入其他模拟中。

对于测试,我尝试像这样配置myTestClass

when(myTestClass.someMethod(eq(context))).thenReturn(someValue);

现在的问题是,Matchers.eqMyContext的“未增强”版本不匹配。因此,如果在测试期间使用someMethod的“常规”实例实际调用MyContext的值equals来调用context,则不会调用存根方法。

似乎Mockito增强的MyContext类实现了自己的equals方法,至少似乎从未调用过MyContext的equals方法。因此,我目前想不出任何方法来修改实际进行的比较。

我可以想到解决此问题的各种方法,例如使用自定义参数匹配器或将方法与“真实”对象的实例加桩。但是,我想知道:是否有Mockito提供的解决方案来检查增强类与常规类是否相等?

1 个答案:

答案 0 :(得分:2)

从概念上讲这是错误的:Java中的equals()对称的概念:当a.equals(b)时,您最好也找到b.equals(a)! / p>

在您的情况下,a具有类MyContext,而b具有WhateverMockitoSpyDoesToMyContext。因此,即使模拟生成的事物的equals()有效,很可能反过来,“基数”等于也可能返回false(因为原始MyContext类对诸如Mockito那样的潜在子类一无所知在这里做)。

我同意将您的示例弄清楚可能,但是我只是不知道到达那里的“正确”方式。从这个角度来看,您实际上必须研究使用ArgumentMatcher。

除此之外:首先认真考虑您是否真的通过使用eq()获得任何收益。如果该检查是测试的“核心”,那么可以肯定地,您最好以某种方式寻找进行该检查的明确方法。但是,如果它更多地是副产品,则只需使用any()即可。

含义:不要使测试变得不必要的复杂。通常,您还是会针对一种特定情况设置内容。如果被测代码实际上可以正确地将不同的对象传递给该方法,则只需担心传递给someMethod()的事物。