Uvod u proljetni ugovor o oblaku

1. Uvod

Spring Cloud Contract je projekt koji nam, jednostavno rečeno, pomaže u pisanju potrošačkih ugovora (CDC).

To osigurava ugovor između a Proizvođač i a Potrošač, u distribuiranom sustavu - i za interakcije temeljene na HTTP-u i za poruke.

U ovom ćemo kratkom članku istražiti pisanje testnih slučajeva proizvođača i potrošača za Spring Cloud Contract putem HTTP interakcije.

2. Proizvođač - na strani poslužitelja

Napisat ćemo CDC s producentske strane, u obliku EvenOddController - što samo govori je li broj parametar je paran ili neparan:

@RestController javna klasa EvenOddController {@GetMapping ("/ validate / prime-number") javni String isNumberPrime (@RequestParam ("number") Integer number) {return Integer.parseInt (number)% 2 == 0? "Parno": "Neparno"; }}

2.1. Ovisnosti Mavena

Za našu producentsku stranu trebat će nam proljeće-oblak-starter-provjera ugovor ovisnost:

 org.springframework.cloud proljeće-oblak-starter-ugovorni-provjerivač 2.1.1.Opusti test 

I trebat ćemo konfigurirati dodatak za proljetni oblak-ugovor-maven s nazivom naše osnovne klase testa, što ćemo opisati u sljedećem odjeljku:

 org.springframework.cloud proljeće-oblak-ugovor-maven-dodatak 2.1.1.OSPUSTI true com.baeldung.spring.cloud.springcloudcontractproducer.BaseTestClass 

2.2. Postavljanje sa strane proizvođača

U testni paket moramo dodati osnovnu klasu koja učitava naš Spring kontekst:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @DirtiesContext @AutoConfigureMessageVerifier javna klasa BaseTestClass {@Autowired private EvenOddController evenOddController; @ Prije javne void postavke () {StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup (evenOddController); RestAssuredMockMvc.standaloneSetup (standaloneMockMvcBuilder); }}

U / src / test / resursi / ugovori / paket, dodati ćemo testne kitove, kao što je ovaj u datoteci shouldReturnEvenWhenRequestParamIsEven.groovy:

import org.springframework.cloud.contract.spec.Contract Contract.make {description "treba se vratiti čak i kad je unos broja paran" request {method GET () url ("/ validate / prime-number") {queryParameters {parameter (" broj "," 2 ")}}} odgovor {body (" Even ") status 200}} 

Kada pokrenemo izgradnju, dodatak automatski generira testnu klasu pod nazivom ContractVerifierTest to proširuje naše BaseTestClass i stavlja ga / target / generirani-test-izvori / ugovori /.

Imena metoda ispitivanja izvedena su iz prefiksa „potvrditi_ " spojene s imenima naših Groovy test kalupa. Za gornju Groovy datoteku generirani naziv metode bit će “Validate_shouldReturnEvenWhenRequestParamIsEven”.

Pogledajmo ovu automatski generiranu testnu klasu:

javna klasa ContractVerifierTest proširuje BaseTestClass {@Test public void validate_shouldReturnEvenWhenRequestParamIsEven () baca izuzetak {// dao: MockMvcRequestSpecification request = given (); // kada: ResponseOptions odgovor = dan (). spec (zahtjev) .queryParam ("broj", "2") .get ("/ potvrditi / glavni broj"); // tada: assertThat (response.statusCode ()). isEqualTo (200); // i: Niz responseBody = response.getBody (). asString (); assertThat (responseBody) .isEqualTo ("Even"); } 

Izgradnja će također dodati staklenku u naše lokalno spremište Maven kako bi je mogao koristiti naš potrošač.

Stubs će biti prisutni u izlaznoj mapi pod stubs / mapping /.

3. Potrošač - strana klijenta

Potrošačka strana našeg CDC-a trošit će ostatke koje generira proizvođačka strana putem HTTP interakcije radi održavanja ugovora, tako bilo kakve promjene na strani proizvođača prekinule bi ugovor.

Mi ćemo dodati BasicMathController, koji će izraditi HTTP zahtjev za dobivanje odgovora iz generiranih kvara:

@RestController javna klasa BasicMathController {@Autowired private RestTemplate restTemplate; @GetMapping ("/ izračunaj") javni String checkOddAndEven (@RequestParam ("number") Integer number) {HttpHeaders httpHeaders = new HttpHeaders (); httpHeaders.add ("Content-Type", "application / json"); ResponseEntity responseEntity = restTemplate.exchange ("// localhost: 8090 / validate / prime-number? Number =" + broj, HttpMethod.GET, novi HttpEntity (httpHeaders), String.class); vratiti odgovorEntity.getBody (); }}

3.1. Ovisnosti Mavena

Za našeg potrošača morat ćemo dodati proljeće-oblak-ugovor-žica i proljeće-oblak-ugovor-stub-trkač ovisnosti:

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

3.2. Potrošačka strana

Sada je vrijeme da konfiguriramo naš pokretač za zaglušivanje, koji će obavijestiti potrošača o dostupnim klinovima u našem lokalnom spremištu Maven:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @AutoConfigureJsonTesters @AutoConfigureStubRunner (stubs. producent: +: stubs: 8090 ") javna klasa BasicMathControllerIntegrationTest {@Autowired private MockMvc mockMvc; @Test public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven () baca izuzetak {mockMvc.perform (MockMvcRequestBuilders.get ("/ izračun? Broj = 2") .contentType (MediaType.APPLICATION_JSON)) (EndExpect. () .string ("Even")); }}

Imajte na umu da id vlasništvo @AutoConfigureStubRunner napomena navodi:

  • com.baeldung.spring.cloud - the groupId našeg artefakta
  • proljeće-oblak-ugovor-proizvođač - the artefaktId staklenke proizvođača
  • 8090 - luka na kojoj će raditi generirani kvarovi

4. Kad je ugovor raskinut

Ako napravimo bilo kakve promjene na strani proizvođača koje izravno utječu na ugovor bez ažuriranja potrošačke strane, to može rezultirati neuspjehom ugovora.

Na primjer, pretpostavimo da ćemo promijeniti EvenOddController zatraži URI / validate / change / prosti broj s naše strane proizvođača.

Ako ne uspijemo obavijestiti potrošača o ovoj promjeni, potrošač će i dalje poslati svoj zahtjev na / validate / prosti broj URI i ispitni slučajevi sa strane potrošača org.springframework.web.client.HttpClientErrorException: 404 nije pronađeno.

5. Sažetak

Vidjeli smo kako nam Spring Cloud Contract može pomoći u održavanju ugovora između potrošača usluge i proizvođača tako da možemo izgurati novi kôd bez brige da ćemo prekršiti ugovore.

I kao i uvijek, potpunu provedbu ovog vodiča možete pronaći na GitHubu.


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