【问题标题】:Easymock matcher for Object Array对象数组的 Easymock 匹配器
【发布时间】:2013-10-10 13:03:52
【问题描述】:

我有以下课程:

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

那么,如何解决这个问题呢?

【问题讨论】:

    标签: java junit mocking easymock


    【解决方案1】:

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

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

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

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

    【讨论】:

    • equals 不是问题。如果两个 UserDetailTO 对象具有相同的用户 ID 和空的第二个参数,则它们是相等的。但是 aryEq 只是比较数组内对象的引用,而不是调用 UserDetailTO.equals(Object)。我们在 EasyMock 中没有类似 isAnyArray() 的东西吗?
    • 那么infoTO.getUserId() 是否返回“zzzz”?
    • 我的错误......你是对的,infoTO.getUserId() 不返回“zzzz”。谢谢。但我仍然想知道是否有任何其他选择...类似于 isAnyArray()。
    • “anyArray()”的想法可以通过isA(UserDetailTO[].class)在EasyMock中完成
    • 太棒了……这就是我想要的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多