Unit testing 是否将参数获取/保存到预期的JMock方法调用?

Unit testing 是否将参数获取/保存到预期的JMock方法调用?,unit-testing,jmock,Unit Testing,Jmock,我想测试一个“适配器”对象,当它接收到xml消息时, 它将其摘要化为一个消息对象,将消息ID+CorrelationID同时放入 带有时间戳并将其转发到客户端对象。=20 一条消息可以与前一条消息关联(例如m2.correlationID=3D m1.ID) 我模拟客户端,并检查适配器是否成功调用 “client.forwardMessage(m)”两次,第一条消息为null correlationID,以及具有非空correlationID的第二个 但是,我想精确地测试CorrelationI

我想测试一个“适配器”对象,当它接收到xml消息时, 它将其摘要化为一个消息对象,将消息ID+CorrelationID同时放入 带有时间戳并将其转发到客户端对象。=20 一条消息可以与前一条消息关联(例如m2.correlationID=3D m1.ID)

我模拟客户端,并检查适配器是否成功调用 “client.forwardMessage(m)”两次,第一条消息为null correlationID,以及具有非空correlationID的第二个

但是,我想精确地测试CorrelationID是否已设置 正确地,通过抓取ID(例如m1.ID)

但我无论如何也找不到这样做的方法

有一个关于添加该功能的消息,但是没有人评论它 是未分配的

这真的没有实现吗

我阅读了关于重新设计适配器以使用 IdGenerator对象,我可以存根,但我认为会有太多 对象=20 你不认为将对象拆分到so会增加不必要的复杂性吗 细粒度

谢谢,非常感谢您的评论:-)

Tayeb

可以使用matcher()检查是否将正确的参数传递到方法中。注意,您需要静态导入匹配器(在我的示例中为HasCorrelationId)

下面的示例断言,client.forwardMessage(m)被调用一次,调用的消息correlationId为null,调用一次的消息correlationId=“abc”


我们已经做了一些努力来简化Hamcrest 1.2中matchers的编写。有一个新的FeatureMatcher,它需要更少的工作

import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;

public class HasCorrelationId extends TypeSafeMatcher<Message> {
    private final Object expectedCorrelationId;
    public HasCorrelationId(Object expectedCorrelationId) {
        this.expectedCorrelationId = expectedCorrelationId;
    }
    @Override
    public boolean matchesSafely(Message message) {
        if (expectedCorrelationId==message.getCorrelationId()) return true;
        return expectedCorrelationId==null? false: expectedCorrelationId.equals(message.getCorrelationId());

    }

    public void describeTo(Description description) {
        description.appendText("hasCorrelationId("+expectedCorrelationId+")");

    }

    public static HasCorrelationId hasCorrelationId(Object correlationId) {    
    return new HasCorrelationId(correlationId);
    }
}
public class MyTest {
    private Mockery context = new Mockery();

  @Test
  public void testCorrelationId() {
    final Client client = context.mock(Client.class);
    final Message message1 = context.mock(Message.class,"message1");
    final Message message2 = context.mock(Message.class,"message2");

    context.checking(new Expectations(){{
        allowing(message1).getCorrelationId();will(returnValue(null));
        allowing(message2).getCorrelationId();will(returnValue("abc"));

        one(client).forwardMessage(with(hasCorrelationId(null)));
        one(client).forwardMessage(with(hasCorrelationId("abc")));
    }});

    client.forwardMessage(message1);
    client.forwardMessage(message2);
    }

}