2013-10-10 3 views
2

У меня есть следующий класс:EasyMock согласовани для массива объектов

public class Listener{ 

@Autowired 
private Handler handler; 


public void receiveMessage(Message<String> message) { 
    String xmlMessage = message.getPayload().toString(); 

    XStream xstream = new XStream(); 
    xstream.processAnnotations(InfoTO.class); 

    infoTO = (InfoTO) xstream.fromXML(xmlMessage); 


    UserDetailTO[] userDetailTO = { new UserDetailTO(infoTO.getUserId(), null) }; 
    handler.sendEmail(userDetailTO); 

} 

}

Мой метод испытания:

@Test 
public void testRecieve() { 
    UserDetailTO[] userDetails={new UserDetailTO("zzzz",null)}; 

    Handler handlerMock=EasyMock.createMock(Handler.class); 
    handlerMock.sendEmail(aryEq(userDetails)); 
    EasyMock.expectLastCall(); 
    EasyMock.replay(handlerMock); 
    ReflectionTestUtils.setField(listener, "handler", handlerMock); 

    String message = "Test Payload"; 
    Message<String> finalMessage = MessageBuilder.withPayload(message).build(); 
    listener.receiveMessage(finalMessage); 

} 

Когда я запускаю этот тестовый класс, я получаю ошибку Assertion для Неожиданное вызов метода. Ожидается, что в тестовом классе экземпляр UserDetailTO, вставленный в массив, не будет соответствовать экземпляру, созданному в классе Listener.

Но тогда, как решить эту проблему?

ответ

2

Похож на проблему с методом UserDetailTO.equals(Object). Являются ли 2 UserDetailTO объектами равными, если они имеют одинаковый идентификатор пользователя и нулевой 2-й параметр?

Также ваша линия EasyMock.expectLastCall(); не требуется. Когда макет находится в режиме воспроизведения, все методы void автоматически «ожидаются». Вам нужно только позвонить EasyMock.expectLastCall(), если вы хотите выполнить какое-либо другое поведение, например, выбросить исключение или вызвать IAnswer, когда вызывается этот метод void.

Например, если вы хотите метод sendEmail бросить исключение:

Exception expectedException = new Exception(...); 
... 
handlerMock.sendEmail(aryEq(userDetails)); 
EasyMock.expectLastCall().andThrow(expectedException); 

EasyMock.replay(handlerMock); 
+0

равно не является проблемой. Два объекта UserDetailTO равны, если они имеют одинаковый идентификатор пользователя и нулевой 2-й параметр. Но aryEq только сравнивает ссылку объектов внутри массива, а не вызывает UserDetailTO.equals (Object). Разве у нас нет ничего подобного isAnyArray() в EasyMock? – Ayushi

+1

Затем 'infoTO.getUserId()' return "zzzz"? – dkatzel

+0

Моя ошибка ... вы были правы, infoTO.getUserId() не возвращает «zzzz». Благодарю. Но все же я хотел бы знать, есть ли другой вариант ... что-то вроде isAnyArray(). – Ayushi

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