Java EE アプリケーションに Pact コンシューマ テストを実装したいと考えています。このテストは、実際の REST 呼び出しをトリガーするコンシューマー サービス メソッドを呼び出します。
これまでの Pact テストは次のとおりです。
@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);
}
}
興味深い部分は次の行です。
myService.sendNotification(mailNotification);
コンシューマ単体テストを実行しているため、MyService の注入が機能しません。つまり、myService が null になります。さらに、Pact の模擬サーバーに対してリクエストを送信するようにサービスに指示する必要があると思います?
もちろん、テストで最後の REST リクエストを発行することもできますが、これではサービス ロジックが無視されます。
ここで何かが足りないと思いますか?
------------------------
はい、@PactVerification テストでモック サーバーをヒットする必要があります。実際のアプリケーション コードなしで起動しないでください。将来変更があった場合に備えて、これはある程度意味があります。そのリクエストの HTTP プロパティを変更するとテストは失敗するはずです