Пакт для MessageQueue's: образец теста провайдера в случае MessageQueues

Я написал пример теста Pact для MessageProvider, ссылаясь на пример, приведенный в репозитории pact. Ниже приведен потребительский тест, который генерирует JACT-файл PACT для сообщения, ожидаемого от провайдера.

В случае API, чтобы проверить PACT, я смог сделать это с помощью плагина "pact-jvm-provider-maven". В этом случае PACT сверяется с действующим размещенным сервисом API Провайдера.

Мой вопрос, как в случае MessageQueue, PACT будет проверен? Будет ли создаваться ложная очередь? или мне нужно опубликовать сообщение в фактической очереди и проверить соответствие сообщения PACT этому сообщению, опубликованному в очереди.

Может кто-нибудь объяснить, как именно это работает?

Также, пожалуйста, укажите мне пример кода (пример теста), который будет написан на стороне поставщика для проверки сообщения MessageQueue.

Пример сообщения (потребительского) теста:

открытый класс Inbound_Receiving_OpenMessageTest { private byte[] receiveOpenLoadDetailsMessage;

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

}

1 ответ

Этот пост в блоге объясняет это более подробно.

По сути, идея заключается в том, что если вы можете проверить, что код, который помещает сообщение в очередь, соответствует контракту (провайдеру), а код, который обрабатывает сообщение из очереди, также соответствует контракту (потребителю), вы на самом деле не нужна очередь сообщений для проверки контракта.

Другие вопросы по тегам