[[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> { @Override public Collection 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.