Search code examples
testingmicroservicespact

Is pact consumer test for generating contract json files only?


Is pact consumer test for generating contract json files?

I am studing pact and got qurioused about what is the consumer test for? It tests the response that the test class defindes.

In my code below. I defined a response with 200 and simple body, then Test it calling by mockProvider. seems useless. Anybody please give me some guides.

public class PactTest {

  @Rule
  public PactProviderRuleMk2 mockProvider
        = new PactProviderRuleMk2("test-provider", "localhost", 8017, this);


  @Pact(consumer = "test-consumer")
  public RequestResponsePact createPact(PactDslWithProvider builder){
    Map<String, String> headers = new HashMap<>();

    return builder
            .given("test Get")
                .uponReceiving("GET REQUEST")
                .path("/pact")
                .method("GET")
            .willRespondWith()
                .status(200)
                .headers(headers)
                .body("{\"condition\": true, \"name\":\"tom\"}")
            .toPact();
  }

  @Test
  @PactVerification
  public void givenGet_whenSendRequest_shouldReturn200withProperHeaderAndBody() {
    ResponseEntity<String> res = new RestTemplate()
                                        .getForEntity(mockProvider.getUrl()+"/pact", String.class);

    assertThat(res.getStatusCode().value()).isEqualTo(200);
  }
}

Solution

  • Short answer - no.

    Calling the mock API in the test independent of your actual consumer code is worthless (as you imply), because it is a self-fulfilling prophecy. Pact is designed to test the collaborating service on the Consumer side; the adapter code that makes the call to the Provider.

    Typically, this call will pass through things like data-access layers and other intermediates. Your Pact tests would use a service that uses these, and the benefit is that the contract gets defined through this process, that is guaranteed to be up-to-date with consumer needs, because it is generated via your code.

    We've just updated the docs today, perhaps that helps.