0

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

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

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

但我无论如何都找不到这样做。

有一个关于添加该功能的jira,但没有人评论并且未分配。

这真的没有实现吗?

我读到了重新设计适配器以使用 IdGenerator 对象的替代方法,我可以存根,但我认为会有太多对象。=20 你不认为将对象拆分到如此精细的粒度会增加不必要的复杂性吗?

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

塔耶布

4

2 回答 2

1

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

下面的示例断言 client.forwardMessage(m) 被调用一次,带有空相关 ID 的消息和一次带有相关 ID =“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);
    }

}
于 2009-05-10T07:20:18.453 回答
0

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

于 2009-05-21T12:32:53.240 回答