anchor.diff:  ----
   ====
   
  -The base class would set up the applicatoin running on a random port.
  +The base class would set up the application running on a random port.
   
   ====
   [source,java,indent=0,subs="verbatim,attributes"]
  
positive.code: }
  
  ----
  ====
negative.code:     // in this config class you define all controllers and mocked services
  include::{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.java[tags=config,indent=0]
  
  }
  ----
  ====
  
  [[features-custom-mode]]
  === Custom Mode
  
  IMPORTANT: This mode is experimental and can change in the future!
  
  The Spring Cloud Contract allows you to provide your own, custom implementation of the
  `org.springframework.cloud.contract.verifier.http.HttpVerifier`. That way you can use any client you want to send and receive a request. The default implementation in Spring Cloud Contract is `OkHttpHttpVerifier` and it leverages OkHttp3 http client.
  
  ====
  [source,groovy,indent=0]
  ----
  testMode = 'CUSTOM'
  ----
  ====
  
  The following example shows a generated test:
  
  ====
  [source,java,indent=0]
  ----
  package com.example.beer;
  
  import com.example.BeerRestBase;
  import javax.inject.Inject;
  import org.springframework.cloud.contract.verifier.http.HttpVerifier;
  import org.springframework.cloud.contract.verifier.http.Request;
  import org.springframework.cloud.contract.verifier.http.Response;
  import org.junit.jupiter.api.Test;
  import org.junit.jupiter.api.extension.ExtendWith;
  
  import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat;
  import static org.springframework.cloud.contract.verifier.util.ContractVerifierUtil.*;
  import static org.springframework.cloud.contract.verifier.http.Request.given;
  
  @SuppressWarnings("rawtypes")
  public class RestTest extends BeerRestBase {
  	@Inject HttpVerifier httpVerifier;
  
  	@Test
  	public void validate_shouldGrantABeerIfOldEnough() throws Exception {
  		// given:
  			Request request = given()
  					.post("/beer.BeerService/check")
  					.scheme("HTTP")
  					.protocol("h2_prior_knowledge")
  					.header("Content-Type", "application/grpc")
  					.header("te", "trailers")
  					.body(fileToBytes(this, "shouldGrantABeerIfOldEnough_request_PersonToCheck_old_enough.bin"))
  					.build();
  
  
  		// when:
  			Response response = httpVerifier.exchange(request);
  
  
  		// then:
  			assertThat(response.statusCode()).isEqualTo(200);
  			assertThat(response.header("Content-Type")).matches("application/grpc.*");
  			assertThat(response.header("grpc-encoding")).isEqualTo("identity");
  			assertThat(response.header("grpc-accept-encoding")).isEqualTo("gzip");
  
  		// and:
  			assertThat(response.getBody().asByteArray()).isEqualTo(fileToBytes(this, "shouldGrantABeerIfOldEnough_response_Response_old_enough.bin"));
  	}
  
  }
  ----
  ====
  
  Corresponding base class could look like this:
  
  ====
  [source,java,indent=0]
  ----
  @SpringBootTest(classes = BeerRestBase.Config.class,
  		webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  public abstract class BeerRestBase {
  
  	@Configuration
  	@EnableAutoConfiguration
  	static class Config {
  
  		@Bean
  		ProducerController producerController(PersonCheckingService personCheckingService) {
  			return new ProducerController(personCheckingService);
  		}
  
  		@Bean
  		PersonCheckingService testPersonCheckingService() {
  			return argument -> argument.getAge() >= 20;
  		}
  
  		@Bean
  		HttpVerifier httpOkVerifier(@LocalServerPort int port) {
  			return new OkHttpHttpVerifier("localhost:" + port);
  		}
  
  	}
  }
  ----
  ====
  