2

我有以下课程:

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 类中创建的实例不匹配。

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

4

1 回答 1

3

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

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

例如,如果您希望该sendEmail方法抛出异常:

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

EasyMock.replay(handlerMock);
于 2013-10-10T17:20:20.920 回答