获取/保存参数到预期的JMock方法调用?

时间:2009-01-05 15:46:56

标签: unit-testing jmock

我想测试一个“Adapter”对象,当它收到xml消息时, 它将其消化为Message对象,将消息ID + CorrelationID放在一起 使用时间戳并将其转发给Client对象。= 20 消息可以与先前的消息相关联(例如,m2.correlationID = 3D m1.ID)。

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

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

但我无论如何都找不到。

关于添加功能有一个jira,但没有人评论过它 是未分配的。

这真的没有实现吗?

我读到了重新设计适配器以使用的替代方案 IdGenerator对象,我可以存根,但我认为会有太多 对象。= 20 难道你不认为它会增加不必要的复杂性来分割对象 细粒度?

谢谢,我感谢任何评论: - )

耶卜

2 个答案:

答案 0 :(得分:1)

您可以使用匹配器(http://code.google.com/p/hamcrest)来检查是否获得了传递给方法的正确参数。请注意,您需要静态导入匹配器(在我的示例中为HasCorrelationId)。

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

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);
    }

}

答案 1 :(得分:0)

我们已经努力简化在Hamcrest 1.2中编写匹配器的工作。有一个新的FeatureMatcher需要更少的工作。