Java 在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

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 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
(自反性)。如何得出这个结论取决于开发者。