【问题标题】:Get/save parameters to an expected JMock method call?获取/保存参数到预期的 JMock 方法调用?
【发布时间】:2010-05-09 21:00:04
【问题描述】:

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

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

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

但我找不到这样做的方法。

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

这真的没有实现吗?

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

谢谢,感谢任何 cmets :-)

塔耶布

【问题讨论】:

    标签: unit-testing jmock


    【解决方案1】:

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

    下面的示例断言,client.forwardMessage(m) 被调用一次,消息为空的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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        相关资源
        最近更新 更多