2017-11-18 129 views
1

我已经通过参考pact repo中给出的示例示例编写了MessageProvider的样本Pact测试。以下是正在生成用于提供者期望的消息的PACT json文件的消费者测试。MessageQueue的契约:MessageQueues情况下的样本提供程序测试

在API的情况下,为了验证PACT,我可以使用“pact-jvm-provider-maven”插件来完成此操作。在这种情况下,PACT将根据提供商的实际托管API服务进行验证。

我的问题是,如何在MessageQueue的情况下,PACT将被验证?模拟队列会被创建吗?或者我需要将消息发布到实际的队列中,并且需要根据发布到Queue的此消息验证PACT消息。

有人可以解释它的工作原理吗?

另请指点示例代码(示例测试)写在提供者端以验证MessageQueue的消息。

示例消息(消费者)测试:

公共类Inbound_Receiving_OpenMessageTest { 专用字节[] receivingOpenLoadDetailsMessage;

@Rule 
public MessagePactProviderRule mockProvider = new MessagePactProviderRule(this); 

@Pact(provider = Configuration.ReceivingProviderOpen, consumer = Configuration.InboundConsumer) 
public MessagePact createPact(MessagePactBuilder builder) { 
    PactDslJsonBody body = (PactDslJsonBody) new PactDslJsonBody() 
      .stringType("_id") 
      .object("delivery") 
       .stringType("deliveryNumber") 
      .closeObject() 
      .array("state") 
        .object() 
         .stringType("changeTime") 
         .stringValue("status", "OPEN") 
         .stringType("changeUser") 
        .closeObject() 
      .closeArray(); 

    Map<String, String> metadata = new HashMap<String, String>(); 
    metadata.put("contentType", "application/json"); 

    return builder 
      .given("Receiving(Open) App State") 
      .expectsToReceive("Receiving Open Load details Test") 
      .withMetadata(metadata) 
      .withContent(body) 
      .toPact(); 
} 

@Test 
@PactVerification({Configuration.ReceivingProviderOpen, "Receiving(Open) App State"}) 
public void test() throws Exception { 
    Assert.assertNotNull(new String(receivingOpenLoadDetailsMessage)); 

    LoadDetails openLoadDetails = null; 
    Gson gson = new GsonBuilder().create(); 
    String entity = new String(receivingOpenLoadDetailsMessage); 
    openLoadDetails = gson.fromJson(entity, LoadDetails.class); 

    if(openLoadDetails.getDelivery().getDeliveryNumber() == null || 
      openLoadDetails.getState().get(0).getChangeUser() == null || 
      openLoadDetails.getState().get(0).getChangeTime() == null || 
      openLoadDetails.getState().get(0).getStatus() == null){ 
     Assert.fail("Either one of the field 'deliveryNumber' or 'changeTime' or 'status' or 'changeUser' is NULL"); 
    } 
} 

public void setMessage(byte[] messageContents) { 
    receivingOpenLoadDetailsMessage = messageContents; 
} 

}

回答

0

This blog post解释了它的更多细节。

基本上,这个想法是,如果你可以验证将消息放入队列的代码符合合同(提供者),并且处理来自队列的消息的代码也符合合同(消费者),您实际上不需要消息队列来验证合同。

+0

感谢罗纳德的指针。如果有更多问题,我会通过帖子回来。 – Sunil

+0

谢谢罗纳德。我仔细阅读了这篇文章,并试图对提供者端消息验证进行抽样测试。我正在上课ConfirmationKafkaMessageBuilder没有解决错误。下面使用的依赖, \t \t \t au.com.dius \t \t \t 协议,JVM的提供商junit_2.11 \t \t \t 3.5.4。和 \t \t \t au.com.dius \t \t \t 协议,JVM的提供商maven_2.11 \t \t \t 3.5.4 \t \t \t 测试 \t \t – Sunil

+0

我能够弄清楚这一点。确认KafkaMessageBuilder是用户定义的函数。谢谢 – Sunil

相关问题