2017-11-18 127 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

相關問題