En introduktion til Spring Cloud-kontrakt

1. Introduktion

Spring Cloud Contract er et projekt, der simpelt sagt hjælper os med at skrive Consumer-Driven Contracts (CDC).

Dette sikrer kontrakten mellem en Producent og en Forbruger, i et distribueret system - til både HTTP-baserede og meddelelsesbaserede interaktioner.

I denne hurtige artikel undersøger vi skrivepriser fra producent- og forbrugersiden til Spring Cloud Contract gennem en HTTP-interaktion.

2. Producent - serversiden

Vi skriver en producentside CDC i form af en EvenOddController - som bare fortæller om nummer parameter er lige eller ulige:

@RestController public class EvenOddController {@GetMapping ("/ validate / prime-number") public String isNumberPrime (@RequestParam ("number") Integer number) {return Integer.parseInt (number)% 2 == 0? "Even": "Odd"; }}

2.1. Maven afhængigheder

For vores producentside har vi brug for spring-cloud-starter-contract-verifier afhængighed:

 org.springframework.cloud spring-cloud-starter-contract-verifier 2.1.1.RELEASE test 

Og vi bliver nødt til at konfigurere spring-cloud-contract-maven-plugin med navnet på vores basistestklasse, som vi beskriver i det næste afsnit:

 org.springframework.cloud spring-cloud-contract-maven-plugin 2.1.1.RELEASE true com.baeldung.spring.cloud.springcloudcontractproducer.BaseTestClass 

2.2. Producentens sideopsætning

Vi er nødt til at tilføje en basisklasse i testpakken, der indlæser vores forårssammenhæng:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @DirtiesContext @AutoConfigureMessageVerifier public class BaseTestClass {@Autowired private EvenOddController evenOddController; @Før offentlig ugyldig opsætning () {StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup (evenOddController); RestAssuredMockMvc.standaloneSetup (standaloneMockMvcBuilder); }}

I / src / test / ressourcer / kontrakter / pakke, tilføjer vi teststubberne, som denne i filen shouldReturnEvenWhenRequestParamIsEven.groovy:

import org.springframework.cloud.contract.spec.Contract Contract.make {beskrivelse "skal vende tilbage, selvom nummerinput er lige" anmodning {metode GET () url ("/ validate / prime-number") {queryParameters {parameter (" nummer "," 2 ")}}} respons {body (" Even ") status 200}} 

Når vi kører bygningen, plugin genererer automatisk en testklasse med navnet ContractVerifierTest der udvider vores BaseTestClass og lægger den ind / mål / genereret-test-kilder / kontrakter /.

Navnene på testmetoderne er afledt af præfikset “validere_ ” sammenkædet med navnene på vores Groovy teststubber. For ovenstående Groovy-fil vil det genererede metodenavn være “Validate_shouldReturnEvenWhenRequestParamIsEven”.

Lad os se på denne auto-genererede testklasse:

offentlig klasse ContractVerifierTest udvider BaseTestClass {@Test offentlig ugyldig validate_shouldReturnEvenWhenRequestParamIsEven () kaster undtagelse {// givet: MockMvcRequestSpecification anmodning = givet (); // når: ResponseOptions svar = givet (). spec (anmodning) .queryParam ("nummer", "2") .get ("/ validere / primtal"); // derefter: assertThat (respons.statusCode ()). er EqualTo (200); // og: String responseBody = respons.getBody (). asString (); assertThat (responseBody) .isEqualTo ("Even"); } 

Bygningen tilføjer også stubburken i vores lokale Maven-arkiv, så den kan bruges af vores forbruger.

Stubbe vil være til stede i outputmappen under stubs / kortlægning /.

3. Forbruger - kundesiden

Forbrugersiden af ​​vores CDC vil forbruge stubs, der genereres af producentsiden gennem HTTP-interaktion for at opretholde kontrakten, så eventuelle ændringer på producentsiden ville bryde kontrakten.

Vi tilføjer BasicMathController, som sender en HTTP-anmodning for at få svaret fra de genererede stubber:

@RestController offentlig klasse BasicMathController {@Autowired privat RestTemplate restTemplate; @GetMapping ("/ beregne") offentlig streng checkOddAndEven (@RequestParam ("nummer") Heltal) {HttpHeaders httpHeaders = nye HttpHeaders (); httpHeaders.add ("Content-Type", "application / json"); ResponseEntity responseEntity = restTemplate.exchange ("// localhost: 8090 / validate / prime-number? Number =" + number, HttpMethod.GET, new HttpEntity (httpHeaders), String.class); returnere responsEntity.getBody (); }}

3.1. Maven-afhængighederne

For vores forbruger skal vi tilføje spring-cloud-contract-wiremock og spring-cloud-contract-stub-runner afhængigheder:

 org.springframework.cloud spring-cloud-contract-wiremock 2.1.1.RELEASE test org.springframework.cloud spring-cloud-contract-stub-runner 2.1.1.RELEASE test 

3.2. Opsætning af forbrugersiden

Nu er det tid til at konfigurere vores stub-runner, som vil informere vores forbruger om de tilgængelige stubs i vores lokale Maven-lager:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @AutoConfigureJsonTesters @AutoConfigureStubRunner (stubsMode = StubRunnerProperties.StubsMode.OC. producent: +: stubs: 8090 ") offentlig klasse BasicMathControllerIntegrationTest {@Autowired private MockMvc mockMvc; @Test offentlig ugyldighed given_WhenPassEvenNumberInQueryParam_ThenReturnEven () kaster undtagelse {mockMvc.perform (MockMvcRequestBuilders.get ("/ beregne? Antal = 2") .contentType (MediaType.APPLICATION_JSON)).) Og Udsigt (status.). () .streng ("Selv")); }}

Bemærk, at id'er ejendommen til @AutoConfigureStubRunner annotation specificerer:

  • com.baeldung.spring.cloud - det groupId af vores artefakt
  • spring-cloud-contract-producer - det artefaktId af producentens stubkrukke
  • 8090 - den port, som de genererede stubber kører på

4. Når kontrakten er brudt

Hvis vi foretager ændringer på producentsiden, der direkte påvirker kontrakten uden at opdatere forbrugersiden, dette kan resultere i kontraktfejl.

Antag for eksempel, at vi skal ændre EvenOddController anmode URI om / valider / ændr / primtal på vores producentside.

Hvis vi ikke informerer vores forbruger om denne ændring, sender forbrugeren stadig sin anmodning til / valider / primtal URI, og forbrugersiden test tilfælde vil kaste org.springframework.web.client.HttpClientErrorException: 404 ikke fundet.

5. Resume

Vi har set, hvordan Spring Cloud Contract kan hjælpe os med at opretholde kontrakter mellem en serviceforbruger og producent, så vi kan skubbe ny kode ud uden bekymring for at bryde kontrakterne.

Og som altid kan den fulde implementering af denne vejledning findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found