我用两个字段创建了一个简单的测试类,
@Mock
private MyTestClass myTestClass;
@Spy
private final MyContext context = CommonTestData.getDefaultContext();
基本上,我在这里实际上不需要间谍功能,它只是用于自动将对象注入其他模拟中。
对于测试,我尝试像这样配置myTestClass
:
when(myTestClass.someMethod(eq(context))).thenReturn(someValue);
现在的问题是,Matchers.eq
与MyContext
的“未增强”版本不匹配。因此,如果在测试期间使用someMethod
的“常规”实例实际调用MyContext
的值equals
来调用context
,则不会调用存根方法。>
似乎Mockito增强的MyContext
类实现了自己的equals方法,至少似乎从未调用过MyContext
的equals方法。因此,我目前想不出任何方法来修改实际进行的比较。
我可以想到解决此问题的各种方法,例如使用自定义参数匹配器或将方法与“真实”对象的实例加桩。但是,我想知道:是否有Mockito提供的解决方案来检查增强类与常规类是否相等?
答案 0 :(得分:2)
从概念上讲这是错误的:Java中的equals()
是对称的概念:当a.equals(b)
时,您最好也找到b.equals(a)
! / p>
在您的情况下,a
具有类MyContext,而b
具有WhateverMockitoSpyDoesToMyContext。因此,即使模拟生成的事物的equals()
有效,很可能反过来,“基数”等于也可能返回false
(因为原始MyContext类对诸如Mockito那样的潜在子类一无所知在这里做)。
我同意将您的示例弄清楚可能,但是我只是不知道到达那里的“正确”方式。从这个角度来看,您实际上必须研究使用ArgumentMatcher。
除此之外:首先认真考虑您是否真的通过使用eq()
获得任何收益。如果该检查是测试的“核心”,那么可以肯定地,您最好以某种方式寻找进行该检查的明确方法。但是,如果它更多地是副产品,则只需使用any()
即可。
含义:不要使测试变得不必要的复杂。通常,您还是会针对一种特定情况设置内容。如果被测代码实际上可以正确地将不同的对象传递给该方法,则只需担心传递给someMethod()
的事物。