Using service in Pact consumer test with Java EE

163 views Asked by At

I'd like to implement a Pact consumer test in our Java EE application. This test shall invoke a consumer service method which would trigger the actual REST call.

Here's the Pact test so far:

@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "my-service")
public class MyServiceConsumerTest {

    @Inject
    private MyService myService;

    @Pact(consumer = "myConsumer")
    public RequestResponsePact mail(PactDslWithProvider builder) {
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", ContentType.getJSON().asString());

        PactDslJsonBody jsonBody = new PactDslJsonBody()
                .stringValue("emailAddress", "[email protected]")
                .stringValue("subject", "Test subject")
                .stringValue("content", "Test content")
                .asBody();

        return builder
                .given("DEFAULT_STATE")
                .uponReceiving("request for sending a mail")
                    .path("/mail")
                    .method("POST")
                    .headers(headers)
                    .body(jsonBody)
                .willRespondWith()
                    .status(Response.Status.OK.getStatusCode())
                .toPact();
    }

    @Test
    @PactTestFor(pactMethod = "mail")
    public void sendMail() {
        MailNotification mailNotification = MailNotification.builder()
                .emailAddress("[email protected]")
                .subject("Test subject")
                .content("Test content")
                .build();
        myService.sendNotification(mailNotification);
    }
}

The interesting part is this line:

myService.sendNotification(mailNotification);

As I'm running a consumer unit test, the injection of MyService does not work, i.e. results in myService being null. Moreover I think it would be necessary to tell the service to send its request against the Pact mock serveR?

Of course I could just fire the final REST request in the test but that would ignore the service logic.

I guess I'm missing something here?

1

There are 1 answers

0
Artem Ptushkin On

Yes, you should hit the mock server in the @PactVerification test. Don't fire without the actual application code, it makes a few sense in case of future changes. Tests should fail if you change an HTTP property of that request