有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有没有一种方法可以在Mockito中同时通过引用和相等进行匹配?

Mockito的Matcherseq()使用equalssame()使用==运算符

在比较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卡问题的一个经典示例https://en.wikipedia.org/wiki/Wason_selection_task

.equals()可以为true,即使对象没有相同的引用

所以.equals()为true并不意味着==将返回true,并且不是替代


共 (2) 个答案

  1. # 1 楼答案

    equals实现应该执行==检查。如果没有,我会认为这是一个错误。因此,这两种做法都没有必要。例如,如果让eclipse生成equals,那么第一个测试是==检查

    这同样适用于列表,这是AbstractListequals

    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());
    }
    
  2. # 2 楼答案

    我在没有任何配置的情况下成功了。代码如下:

    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