137 lines
3.4 KiB
Plaintext
137 lines
3.4 KiB
Plaintext
[[contract-dsl-multiple]]
|
|
== Multiple Contracts in One File
|
|
|
|
include::partial$_attributes.adoc[]
|
|
|
|
You can define multiple contracts in one file. Such a contract might resemble the
|
|
following example:
|
|
|
|
====
|
|
[source,groovy,indent=0,role="primary"]
|
|
.Groovy
|
|
----
|
|
include::{plugins_path}/spring-cloud-contract-maven-plugin/src/test/projects/multiple-contracts/src/test/resources/contracts/com/hello/v1/WithList.groovy[lines=18..-1,indent=0]
|
|
----
|
|
|
|
[source,yaml,indent=0,role="secondary"]
|
|
.YAML
|
|
----
|
|
include::{verifier_root_path}/src/test/resources/yml/multiple_contracts.yml[indent=0]
|
|
----
|
|
|
|
[source,java,indent=0,subs="verbatim",role="secondary"]
|
|
.Java
|
|
----
|
|
class contract implements Supplier<Collection<Contract>> {
|
|
|
|
@Override
|
|
public Collection<Contract> get() {
|
|
return Arrays.asList(
|
|
Contract.make(c -> {
|
|
c.name("should post a user");
|
|
// ...
|
|
}), Contract.make(c -> {
|
|
// ...
|
|
}), Contract.make(c -> {
|
|
// ...
|
|
})
|
|
);
|
|
}
|
|
|
|
}
|
|
----
|
|
|
|
[source,kotlin,indent=0,subs="verbatim",role="secondary"]
|
|
.Kotlin
|
|
----
|
|
import org.springframework.cloud.contract.spec.ContractDsl.Companion.contract
|
|
|
|
arrayOf(
|
|
contract {
|
|
name("should post a user")
|
|
// ...
|
|
},
|
|
contract {
|
|
// ...
|
|
},
|
|
contract {
|
|
// ...
|
|
}
|
|
}
|
|
----
|
|
====
|
|
|
|
In the preceding example, one contract has the `name` field and the other does not. This
|
|
leads to generation of two tests that look like the following:
|
|
|
|
====
|
|
[source,java,indent=0]
|
|
----
|
|
package org.springframework.cloud.contract.verifier.tests.com.hello;
|
|
|
|
import com.example.TestBase;
|
|
import com.jayway.jsonpath.DocumentContext;
|
|
import com.jayway.jsonpath.JsonPath;
|
|
import com.jayway.restassured.module.mockmvc.specification.MockMvcRequestSpecification;
|
|
import com.jayway.restassured.response.ResponseOptions;
|
|
import org.junit.Test;
|
|
|
|
import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.*;
|
|
import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
public class V1Test extends TestBase {
|
|
|
|
@Test
|
|
public void validate_should_post_a_user() throws Exception {
|
|
// given:
|
|
MockMvcRequestSpecification request = given();
|
|
|
|
// when:
|
|
ResponseOptions response = given().spec(request)
|
|
.post("/users/1");
|
|
|
|
// then:
|
|
assertThat(response.statusCode()).isEqualTo(200);
|
|
}
|
|
|
|
@Test
|
|
public void validate_withList_1() throws Exception {
|
|
// given:
|
|
MockMvcRequestSpecification request = given();
|
|
|
|
// when:
|
|
ResponseOptions response = given().spec(request)
|
|
.post("/users/2");
|
|
|
|
// then:
|
|
assertThat(response.statusCode()).isEqualTo(200);
|
|
}
|
|
|
|
}
|
|
----
|
|
====
|
|
|
|
Notice that, for the contract that has the `name` field, the generated test method is named
|
|
`validate_should_post_a_user`. The one that does not have the `name` field is called
|
|
`validate_withList_1`. It corresponds to the name of the file `WithList.groovy` and the
|
|
index of the contract in the list.
|
|
|
|
The generated stubs are shown in the following example:
|
|
|
|
====
|
|
[source]
|
|
----
|
|
should post a user.json
|
|
1_WithList.json
|
|
----
|
|
====
|
|
|
|
The first file got the `name` parameter from the contract. The second
|
|
got the name of the contract file (`WithList.groovy`) prefixed with the index (in this
|
|
case, the contract had an index of `1` in the list of contracts in the file).
|
|
|
|
TIP: It is much better to name your contracts, because doing so makes
|
|
your tests far more meaningful.
|
|
|