java - 对象数组的 Easymock 匹配器

标签 java junit mocking easymock

我有以下类(class):

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

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

最佳答案

看起来像 UserDetailTO.equals(Object) 有问题方法。是 2 UserDetailTO如果对象具有相同的用户 ID 且第二个参数为 null,则它们相等?

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

例如,如果您想要 sendEmail抛出异常的方法:

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

EasyMock.replay(handlerMock);

关于java - 对象数组的 Easymock 匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296542/

相关文章:

java - 如何在java程序中运行外部测试用例(Class,junit)?

testing - 如何在 void 方法上应用 jUnit 测试

groovy - Spock - 模拟外部服务

java - Type Erasure 抬头,如何规避?

java - 打开完整的网页

unit-testing - Lucene 索引的单元测试

java - 使用模拟对象时测试粒度

c - C 中的函数模拟(用于测试)?

java - 使用 IntelliJ IDEA 12 玩转 2.2 框架

java - 机器人类 - 如果按下按钮?