Как заглушки метода, когда экземпляр конкретного объекта конкретных полей прошло?

Я хочу вернуть 4, когда экземпляр класса Person по [name = "Mohammad", age = 26] где вызван. Я хочу вернуть 5, когда экземпляр класса Person по [name = "Ali", age = 20] где вызван.

Итак, у меня есть эти классы:

public class Person {
    private String name;
    private int age;

Мой класс DAO:

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());
    }

Так почему мой тест не пройден?

2 ответа

Решение

new Person("Mohammad", 26) в Calculator класс и new Person("Mohammad", 26) в вашем тестовом классе не равно, так как вы не перезаписать equals метод в Person учебный класс.

Перезаписать метод равно в 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;
    }

Перезапись hashCode это бесполезно при перезаписи equals() методы

Я не совсем уверен, какую платформу тестирования вы используете, но экземпляры Person, используемые в вызовах when(), не совпадают с экземплярами, используемыми в вашем классе Calculator, поэтому, если вы не переопределяете equals() и hashcode () в Человек, которого они не будут рассматривать как совпадающий.

Ваша IDE должна иметь возможность генерировать подходящие методы equals() и hashcode () по умолчанию.

Другие вопросы по тегам