title: Difficulty in configuring consumer side contract cloud tests
body: <p>
  I'm trying to use spring cloud contract to test my REST API. I'm following the instructions described is this tutorial <a href="https://cloud.spring.io/spring-cloud-contract/" rel="nofollow noreferrer">https://cloud.spring.io/spring-cloud-contract/</a> 
  I'm writing my single base test class using groovy.</p>
  
  <p>My Rest Controller class:</p>
  
  <pre><code>@RestController
  @RequestMapping(headers = arrayOf("X-API-Version=v2"))
  class FileControllerV2(val storageService: StorageService) {
  
      @PostMapping("/contracts.upload")
      fun upload(@RequestParam file: MultipartFile, principal: Principal): FileNameResponse {
          return storageService.save(file, principal.name)
      }
  
      @GetMapping("/contracts.download/{filename:.+}")
      fun download(@PathVariable filename: String): ResponseEntity&lt;*&gt; {
          return storageService.download(filename)
      }
  
      @GetMapping("/contracts.info/{filename:.+}")
      fun info(@PathVariable filename: String): ResponseEntity&lt;*&gt; {
          return storageService.info(filename)
      }
  }
  </code></pre>
  
  <p>My Contract Stub</p>
  
  <pre><code>package contracts.upload
  
  import org.springframework.cloud.contract.spec.Contract
  
  Contract.make {
      request {
          method 'POST'
          url '/contracts.upload'
          multipart(
                  file: named(
                          name: $(c(regex(nonEmpty())), p('filename')),
                          content: $(c(regex(nonEmpty())), p('content'))),
                  principal : $(regex('.+'))
          )
  
          headers {
          contentType('multipart/form-data; boundary=----WebKitFormBoundaryBTX23kTw0Z5a5bsF')
          header('X-API-Version','v2')
  
      }
      }
      response {
          status 200
          body([
                  filename: 'filename'
          ])
          headers {
              contentType('application/json')
          }
      }
  }
  </code></pre>
  
  <p>And my Base class:</p>
  
  <pre><code>class UploadBase extends Specification {
  
      private StorageService storageService = Mock()
  
      def setup() {
          given:
          RestAssuredMockMvc.standaloneSetup(new FileControllerV2(storageService))
      }
  }
  </code></pre>
  
  <p>And after building I've got following stacktrace</p>
  
  <pre><code>15:49:59.550 [Test worker] DEBUG org.springframework.core.env.StandardEnvironment - Adding [systemProperties] PropertySource with lowest search precedence
  15:49:59.554 [Test worker] DEBUG org.springframework.core.env.StandardEnvironment - Adding [systemEnvironment] PropertySource with lowest search precedence
  15:49:59.554 [Test worker] DEBUG org.springframework.core.env.StandardEnvironment - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]
  15:49:59.681 [Test worker] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Looking for request mappings in application context: org.springframework.test.web.servlet.setup.StubWebApplicationContext@5c4dadd7
  15:49:59.712 [Test worker] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - 3 request handler methods found on class com.project.fstorage.storage.FileControllerV2: {public org.springframework.http.ResponseEntity com.project.fstorage.storage.FileControllerV2.download(java.lang.String)={[/contracts.download/{filename:.+}],methods=[GET],headers=[X-API-Version=v2]}, public com.project.fstorage.response.FileNameResponse com.project.fstorage.storage.FileControllerV2.upload(org.springframework.web.multipart.MultipartFile,java.security.Principal)={[/contracts.upload],methods=[POST],headers=[X-API-Version=v2]}, public org.springframework.http.ResponseEntity com.project.fstorage.storage.FileControllerV2.info(java.lang.String)={[/contracts.info/{filename:.+}],methods=[GET],headers=[X-API-Version=v2]}}
  15:49:59.723 [Test worker] INFO org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Mapped "{[/contracts.download/{filename:.+}],methods=[GET],headers=[X-API-Version=v2]}" onto public org.springframework.http.ResponseEntity&lt;?&gt; com.project.fstorage.storage.FileControllerV2.download(java.lang.String)
  15:49:59.725 [Test worker] INFO org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Mapped "{[/contracts.upload],methods=[POST],headers=[X-API-Version=v2]}" onto public com.project.fstorage.response.FileNameResponse com.project.fstorage.storage.FileControllerV2.upload(org.springframework.web.multipart.MultipartFile,java.security.Principal)
  15:49:59.725 [Test worker] INFO org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Mapped "{[/contracts.info/{filename:.+}],methods=[GET],headers=[X-API-Version=v2]}" onto public org.springframework.http.ResponseEntity&lt;?&gt; com.project.fstorage.storage.FileControllerV2.info(java.lang.String)
  15:49:59.994 [Test worker] DEBUG org.jboss.logging - Logging Provider: org.jboss.logging.Slf4jLoggerProvider
  15:49:59.995 [Test worker] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 5.3.5.Final
  15:50:00.015 [Test worker] DEBUG org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver - Found javax.persistence.Persistence on classpath containing 'getPersistenceUtil'. Assuming JPA 2 environment. Trying to instantiate JPA aware TraversableResolver
  15:50:00.016 [Test worker] DEBUG org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver - Instantiated JPA aware TraversableResolver of type org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.
  15:50:00.025 [Test worker] DEBUG org.hibernate.validator.internal.engine.ConfigurationImpl - Setting custom MessageInterpolator of type org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator
  15:50:00.026 [Test worker] DEBUG org.hibernate.validator.internal.engine.ConfigurationImpl - Setting custom ParameterNameProvider of type com.sun.proxy.$Proxy36
  15:50:00.028 [Test worker] DEBUG org.hibernate.validator.internal.xml.ValidationXmlParser - Trying to load META-INF/validation.xml for XML based Validator configuration.
  15:50:00.029 [Test worker] DEBUG org.hibernate.validator.internal.xml.ResourceLoaderHelper - Trying to load META-INF/validation.xml via TCCL
  15:50:00.029 [Test worker] DEBUG org.hibernate.validator.internal.xml.ResourceLoaderHelper - Trying to load META-INF/validation.xml via Hibernate Validator's class loader
  15:50:00.030 [Test worker] DEBUG org.hibernate.validator.internal.xml.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only.
  15:50:00.068 [Test worker] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.test.web.servlet.setup.StubWebApplicationContext@5c4dadd7
  15:50:00.096 [Test worker] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Looking for exception mappings: org.springframework.test.web.servlet.setup.StubWebApplicationContext@5c4dadd7
  15:50:00.113 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Initializing servlet ''
  15:50:00.122 [Test worker] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Adding [servletConfigInitParams] PropertySource with lowest search precedence
  15:50:00.122 [Test worker] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Adding [servletContextInitParams] PropertySource with lowest search precedence
  15:50:00.125 [Test worker] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Adding [systemProperties] PropertySource with lowest search precedence
  15:50:00.125 [Test worker] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Adding [systemEnvironment] PropertySource with lowest search precedence
  15:50:00.125 [Test worker] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Initialized StandardServletEnvironment with PropertySources [servletConfigInitParams,servletContextInitParams,systemProperties,systemEnvironment]
  15:50:00.125 [Test worker] INFO org.springframework.mock.web.MockServletContext - Initializing Spring FrameworkServlet ''
  15:50:00.125 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - FrameworkServlet '': initialization started
  15:50:00.127 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Unable to locate MultipartResolver with name 'multipartResolver': no multipart request handling provided
  15:50:00.127 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Using LocaleResolver [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@186a2f7]
  15:50:00.128 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Using ThemeResolver [org.springframework.web.servlet.theme.FixedThemeResolver@71cabba8]
  15:50:00.128 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Using RequestToViewNameTranslator [org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@53aff6f3]
  15:50:00.128 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Using FlashMapManager [org.springframework.web.servlet.support.SessionFlashMapManager@5138be3e]
  15:50:00.128 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Published WebApplicationContext of servlet '' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.]
  15:50:00.128 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - FrameworkServlet '': initialization completed in 3 ms
  15:50:00.128 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Servlet '' configured successfully
  15:50:00.175 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - DispatcherServlet with name '' processing POST request for [/contracts.upload]
  15:50:00.177 [Test worker] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Looking up handler method for path /contracts.upload
  15:50:00.179 [Test worker] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Did not find handler method for [/contracts.upload]
  15:50:00.179 [Test worker] WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/contracts.upload] in DispatcherServlet with name ''
  15:50:00.179 [Test worker] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Successfully completed request
  
  Condition not satisfied:
  
  response.statusCode == 200
  |        |          |
  |        404        false
  io.restassured.module.mockmvc.internal.MockMvcRestAssuredResponseImpl@77920871
  
  Condition not satisfied:
  
  response.statusCode == 200
  |        |          |
  |        404        false
  io.restassured.module.mockmvc.internal.MockMvcRestAssuredResponseImpl@77920871
  
      at org.springframework.cloud.contract.verifier.tests.UploadSpec.validate_shouldSaveFile(UploadSpec.groovy:25)
  </code></pre>
  
  <p>I don't know what can be the cause of not recognising these endpoints.</p>
  
  <p><strong><em>Edited</em></strong>
  I've added generated tests</p>
  
  <pre><code>package org.springframework.cloud.contract.verifier.tests
  
  import com.jayway.jsonpath.DocumentContext
  import com.jayway.jsonpath.JsonPath
  import com.project.fstorage.UploadBase
  
  import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson
  import static io.restassured.module.mockmvc.RestAssuredMockMvc.*
  import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat
  
  class UploadSpec extends UploadBase {
  def validate_shouldSaveFile() throws Exception {
      given:
      def request = given()
              .header("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundaryBTX23kTw0Z5a5bsF")
              .header("X-API-Version", "v2")
              .multiPart('file', 'filename', 'content'.bytes)
              .param('principal', 'レ')
  
      when:
      def response = given().spec(request)
              .post("/contracts.upload")
  
      then:
      response.statusCode == 200
      response.header('Content-Type') ==~ java.util.regex.Pattern.compile('application/json.*')
      and:
      DocumentContext parsedJson = JsonPath.parse(response.body.asString())
      assertThatJson(parsedJson).field("['filename']").isEqualTo("filename")
  }
  
  }
  </code></pre>