Java 当传递特定对象特定字段的实例时,如何存根方法?

Java 当传递特定对象特定字段的实例时,如何存根方法?,java,unit-testing,matcher,hamcrest,Java,Unit Testing,Matcher,Hamcrest,我想在调用Person类的[name=“Mohammad”,age=26]时返回4。 我想通过调用[name=“Ali”,age=20]返回Person类实例时的5 所以我有这些课程: public class Person { private String name; private int age; 我的刀类: public class DAO { public int getA(Person person) { return 1; }

我想在调用Person类的[name=“Mohammad”,age=26]时返回4。 我想通过调用[name=“Ali”,age=20]返回Person类实例时的5

所以我有这些课程:

public class Person {
    private String name;
    private int age;
我的刀类:

public class DAO {
    public int getA(Person person) {
        return 1;
    }

    public int getB(Person person) {
        return 2;
    }
}
这是计算器课

   public class Calculator {
        private DAO dao;

        public int add() {
            dao = new DAO();
            return dao.getA(new Person("Mohammad", 26)) +
                    dao.getB(new Person("Ali", 20));
        }
    }
这是我的测试:

    @Test
    public void testAdd() throws Exception {

        when(mydao.getA(new Person("Mohammad", 26))).thenReturn(4);
        when(mydao.getB(new Person("Ali", 20))).thenReturn(5);
        whenNew(DAO.class).withNoArguments().thenReturn(mydao);

        assertEquals(9, cal.add());
    }

那么为什么我的测试会失败呢?

我不太确定您使用的是哪个测试框架,但是when()调用中使用的Person实例与计算器类中使用的实例不同,因此除非您亲自重写equals()和hashcode(),否则它们不会被视为匹配

您的IDE应该能够生成合适的默认equals()和hashcode()方法。

计算器中的new Person(“Mohammad”,26)
类和测试类中的new Person(“Mohammad”,26)是不相等的,因为您没有覆盖
Person
类中的
equals
方法

覆盖
Person
类中的等于方法,如下所示

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        if (name != null ? !name.equals(person.name) : person.name != null) return false;

        return true;
    }
当覆盖
equals()
方法时,覆盖
hashCode
是非常必要的