Java 在Mockito中是否有一种方法可以通过引用和相等同时匹配?
Mockito的Java 在Mockito中是否有一种方法可以通过引用和相等同时匹配?,java,unit-testing,mockito,Java,Unit Testing,Mockito,Mockito的匹配器有eq()和same(),前者使用=运算符 在比较Mockito中的对象时,是否有方法同时使用这两种方法 假设我们有 List list1 = new ArrayList(); List list2 = new ArrayList(); System.out.println(list1.equals(list2)); //true System.out.println(list1 == list2); //false /* and I want to ch
匹配器
有eq()
和same()
,前者使用=
运算符
在比较Mockito
中的对象时,是否有方法同时使用这两种方法
假设我们有
List list1 = new ArrayList();
List list2 = new ArrayList();
System.out.println(list1.equals(list2)); //true
System.out.println(list1 == list2); //false
/* and I want to check that the references are the same,
and the list contents haven't changed */
因此,如果有一个运算符同时执行==
和.equals()
如果您想检查返回的列表是否相同,并且列表内容是否相同,而不需要做两个断言,那么这将非常有用
此外,这可能是4卡问题的一个经典示例
即使对象没有相同的引用,.equals()
也可以为真
因此
.equals()
为true并不意味着==
将返回true,而不是替代值。实现equals
应该进行=
检查。如果没有,我会认为这是一个错误。因此,这两种做法都没有必要。例如,如果让eclipse生成equals
,第一个测试是=
检查
同样适用于列表,这是的等于抽象列表的:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
公共布尔等于(对象o){
如果(o==这个)
返回true;
如果(!(列表实例))
返回false;
ListIterator e1=ListIterator();
ListIterator e2=((List)o).ListIterator();
而(e1.hasNext()&&e2.hasNext()){
eo1=e1.next();
对象o2=e2.next();
如果(!(o1==null?o2==null:o1.equals(o2)))
返回false;
}
返回!(e1.hasNext()| e2.hasNext());
}
我在没有任何配置的情况下成功了。代码如下:
public class MockedObject {
public String foo(List list) {
throw new RuntimeException("foo");
}
}
public class User {
public void boo(MockedObject object, List list1) {
System.out.println(object.foo(new ArrayList()));
}
}
@RunWith(MockitoJUnitRunner.class)
public class UserTest {
@Mock
MockedObject mockedObject;
@Test
public void testUser() throws Exception {
List list1 = new ArrayList();
List list2 = new ArrayList();
when(mockedObject.foo(list1)).thenReturn("mocked");
User user = new User();
user.boo(mockedObject, list1);
user.boo(mockedObject, list2);
}
}
测试通过,输出为:
mocked
mocked
您希望它如何同时使用这两种功能?现在还不清楚你想要达到什么效果。另一方面,当=
产生true时,任何等于的实现如果不返回true
,则会被破坏。对于列表,等于比较对象,而==比较引用。如果我想用相同的对象匹配相同的列表,这会有所帮助。但肯定等于在这种情况下就行了。如果你能给出一个简短而完整的例子,你的问题就更容易理解了。您现在已经给出了一些示例,但仍不清楚。您想要测试的完整代码,加上测试本身(理想情况下避免原始类型),将使您更容易获得帮助。您不能在同一测试中使用它们,因为它们不是相互排斥的,Mockito将采用最适合的最后一条规则。您对eq()
和same()
的研究获得了一致好评,这帮助我了解了后者。当使用doNothing().when(variable).method(list1)时,无法执行2个断言;在equals
中执行=
不是“应该做的”:a.equals(a)
必须返回true
(自反性)。如何得出这个结论取决于开发者。