私はpact-JVMを使用して2つのサービスの間で契約を生成しようとしています。しかし、Javaクラスを実行しようとすると、この例外が発生します。pact-jvm:au.com.dius.pact.consumer.PactMismatchesExceptionを解決する方法
1)私はPact本体に何か問題があると思われますが、それは間違いありませんか? PactDslWithProviderのJSON本体に余分な 'message'パラメータがありますが、runTest1()メソッドではリストのみを比較しています。結果を調べると、私と同じです。 2)runTest1()メソッドで実際のプロバイダURLを指定するのは正しいですか?私はちょうど私が@Ruleをコメントアウト場合ことがわかっ
:
以下au.com.dius.pact.consumer.PactMismatchesException: The following requests were not received:
method: GET
path: /devices/v1
query: [externalId:[0942dc67-35de-44f7-a061-743f59436a98]]
headers: [:]
matchers: MatchingRules(rules=[:])
generators: Generators(categories={})
body: OptionalBody(state=MISSING, value=null)
私のJavaクラスが
public class PactForDevice {
Map<String, String> headers = MapUtils.putAll(new HashMap<String, String>(), new String[]{"Content-Type", "application/json;charset=UTF-8"});
@Rule
public PactProviderRuleMk2 provider = new PactProviderRuleMk2("device-service-m", this);
@Pact(consumer = "device-r", provider = "device-service-m")
public RequestResponsePact createFragment(PactDslWithProvider builder) {
return builder
.given("Device M details")
.uponReceiving("retrieving Device details")
.path("/devices/v1")
.method("GET")
.query("externalId=0942dc67-35de-44f7-a061-743f59436a98")
.willRespondWith()
.headers(headers)
.status(200)
.body("{" +
"\"data\": [,\n " +
"{ \n" +
" \"dateRegistered\": \"2017-07-13T11:10:51.000+12:00\",\n" +
" \"alias\": \"\",\n" +
" \"id\": \"a02b14ee72192ab3\",\n" +
" \"description\": \"Samsung SM-G930F\",\n" +
" \"title\": \"a02b14ee72192ab3\",\n" +
" \"externalId\": \"0942dc67-35de-44f7-a061-743f59436a98\"\n" +
"},\n" +
"{\n" +
" \"dateRegistered\": \"2017-07-13T10:45:51.000+12:00\",\n" +
" \"alias\": \"\",\n" +
" \"id\": \"a41c3af56ec35874\",\n" +
" \"description\": \"Samsung SM-T819\",\n" +
" \"title\": \"a41c3af56ec35874\",\n" +
" \"externalId\": \"0942dc67-35de-44f7-a061-743f59436a98\"\n" +
" },\n" +
" {\n" +
" \"dateRegistered\": \"2017-07-13T10:45:31.000+12:00\",\n" +
" \"alias\": \"\",\n" +
" \"id\": \"bd2b027bbd0a2f17\",\n" +
" \"description\": \"Samsung SM-A320Y\",\n" +
" \"title\": \"bd2b027bbd0a2f17\",\n" +
" \"externalId\": \"0942dc67-35de-44f7-a061-743f59436a98\"\n" +
" }\n" +
"],\n" +
" \"message\": \"3 devices found for the user 0942dc67-35de-44f7-a061-743f59436a98\"\n" +
"}")
.toPact();
}
@PactVerification("device-service-m")
@Test
@JsonIgnoreProperties(ignoreUnknown = true)
public void runTest1() throws IOException {
final GetDevicesResponse deviceResponse = new GetDevicesResponse();
final List<Device> deviceList = new ArrayList<>();
Device dev = new Device();
dev.withDateRegistered("2017-07-13T11:10:51.000+12:00");
dev.withAlias("");
dev.withId("a02b14ee72192ab3");
dev.withDescription("Samsung SM-G930F");
dev.withTitle("a02b14ee72192ab3");
dev.withExternalId("0942dc67-35de-44f7-a061-743f59436a98");
deviceList.add(dev);
Device dev1 = new Device();
dev1.withDateRegistered("2017-07-13T10:45:51.000+12:00");
dev1.withAlias("");
dev1.withId("a41c3af56ec35874");
dev1.withDescription("Samsung SM-T819");
dev1.withTitle("a41c3af56ec35874");
dev1.withExternalId("0942dc67-35de-44f7-a061-743f59436a98");
deviceList.add(dev1);
Device dev2 = new Device();
dev2.withDateRegistered("2017-07-13T10:45:31.000+12:00");
dev2.withAlias("");
dev2.withId("bd2b027bbd0a2f17");
dev2.withDescription("Samsung SM-A320Y");
dev2.withTitle("bd2b027bbd0a2f17");
dev2.withExternalId("0942dc67-35de-44f7-a061-743f59436a98");
deviceList.add(dev2);
deviceResponse.setDevices(deviceList);
final RestTemplate restTemplate = new RestTemplate();
GetDevicesResponse devices = restTemplate.getForObject("http://localhost:8091/devices/v1?externalId=0942dc67-35de-44f7-a061-743f59436a98", GetDevicesResponse.class);
assertThat(devices, sameBeanAs(deviceResponse));
}
}
EDITです(プロバイダが所定の位置にすでにあります)テストは合格ですが、パクトファイルは生成されません。 Shouod私は明示的に "pact"フォルダを指定していますか?
あなたは私の一日を作った:)それは魅力のように働いた。ちょうど1つのことは、私はguavaの依存関係を追加する必要はありませんでした。これは、依存関係なしにpactファイルを生成しました。 – ljs
これを使用して複数のプロバイダを指定することはできますか?ありがとう.. – ljs
はい、サービスが使用するプロバイダごとに異なるテストを作成できます。または、コンシューマがプロバイダからの複数のエンドポイントを消費する場合、createPactメソッドに複数のテストケースを追加できます。また、春の雲を使用している場合は、グアバ19を追加する必要があります。 – ertert