2013-10-10 51 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); 

} 

当我运行这个测试类,我得到断言错误意外方法调用。它的预期是因为在测试类中,插入到数组中的UserDetailTO实例与在Listener类中创建的实例不匹配。

但是,如何解决这个问题呢?

回答

2

它看起来像UserDetailTO.equals(Object)方法的问题。如果2个UserDetailTO对象具有相同的用户标识和空的第二个参数,它们是否相等?

也不需要你的线EasyMock.expectLastCall();。当模拟处于重放模式时,所有的无效方法都会自动“预期”。如果您想执行其他行为(如抛出异常)或调用void方法时调用IAnswer,则只需致电EasyMock.expectLastCall()

例如,如果你想要的sendEmail方法抛出一个异常:

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

EasyMock.replay(handlerMock); 
+0

等于是没有问题的。如果两个UserDetailTO对象具有相同的用户标识和空的第二个参数,则它们是相等的。但aryEq只比较数组内对象的引用,而不是调用UserDetailTO.equals(Object)。 EasyMock中没有类似isAnyArray()的东西吗? – Ayushi

+1

然后'infoTO.getUserId()'返回“zzzz”? – dkatzel

+0

我的错误...你是对的,infoTO.getUserId()不返回“zzzz”。谢谢。但是我仍然想知道是否还有其他选项,比如isAnyArray()。 – Ayushi