Пакт для 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 ответ
Этот пост в блоге объясняет это более подробно.
По сути, идея заключается в том, что если вы можете проверить, что код, который помещает сообщение в очередь, соответствует контракту (провайдеру), а код, который обрабатывает сообщение из очереди, также соответствует контракту (потребителю), вы на самом деле не нужна очередь сообщений для проверки контракта.