2014-10-16 2 views
1

Я хочу вернуть 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 является nesssacery при перезаписи equals() методов

1

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

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

Смежные вопросы