У меня есть микросервис клиентского интерфейса, который использует несколько других микросервисов, поэтому я хотел бы написать контрактный тест для каждого провайдера.
Я попытался написать следующий код:
public class ClientUIContractProductsTest {
// Pact mock Provider
@Rule
public PactProviderRuleMk2 providerOrdersMicroservice = new PactProviderRuleMk2("microservice-orders", "localhost", 9002, this);
@Rule
public PactProviderRuleMk2 providerProductsMicroservice = new PactProviderRuleMk2("microservice-products", "localhost", 9005, this);
// Step (1)
@Pact(consumer = "microservice-clientui")
public RequestResponsePact createPactForProducts(PactDslWithProvider builder) {
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
return builder
.given("test GET /orders")
.uponReceiving("GET REQUEST FOR ORDERS")
.path("/orders")
.method("GET")
.willRespondWith()
.status(200)
.headers(headers)
.body(LambdaDsl.newJsonArray((a) -> {
a.object((o) -> o
.numberType("id", 1)
.numberType("productId", 1)
.timestamp("dateOrder", "yyyy-MM-dd'T'HH:mm:ss.SSS+0000")
.numberType("quantity",1)
.booleanType("orderPayed", false)
);
}
).build())
.given("test GET /Products")
.uponReceiving("GET REQUEST FOR PRODUCTS")
.path("/Products")
.method("GET")
.willRespondWith()
.status(200)
.headers(headers)
.body(PactDslJsonArray.arrayEachLike()
.numberType("id", 0)
.stringType("title", "Candle working with fire")
.stringType("description", "Candle working like a bulb but without electricity")
.stringType("image","https://live.staticflickr.com/3408/3279558099_6dc30be4b6_b.jpg")
.numberType("price", 22)
.closeObject())
.toPact();
}
@Test
@PactVerification()
public void pactVerification() {
// when
ResponseEntity<String> responseOrders = new RestTemplate()
.getForEntity(providerOrdersMicroservice.getUrl() + "/orders", String.class);
// Step (4)
// then
assertThat(responseOrders.getStatusCode().value()).isEqualTo(200);
/*
* Pact verification for products micro-service
* */
// when
ResponseEntity<String> responseProducts = new RestTemplate()
.getForEntity(providerProductsMicroservice.getUrl() + "/Products", String.class);
// Step (4)
// then
assertThat(responseProducts.getStatusCode().value()).isEqualTo(200);
}
}
Но у меня была ошибка при запуске этого кода. Но когда я бегу только с одним @Rule
Как мне реализовать контракт на издевательство над несколькими провайдерами?