Úvod do jarnej cloudovej zmluvy

1. Úvod

Spring Cloud Contract je projekt, ktorý nám zjednodušene pomáha písať zmluvy riadené spotrebiteľmi (CDC).

Týmto je zabezpečená zmluva medzi a Výrobca a a Spotrebiteľ, v distribuovanom systéme - pre interakcie založené na protokole HTTP aj na správe.

V tomto rýchlom článku sa budeme zaoberať písaním testovacích prípadov na strane výrobcov a spotrebiteľov pre Spring Cloud Contract prostredníctvom interakcie HTTP.

2. Producent - strana servera

Napíšeme stranu CDC pre producenta vo forme EvenOddController - ktorý iba hovorí, či číslo parameter je párny alebo nepárny:

@RestController verejná trieda EvenOddController {@GetMapping ("/ validate / prime-number") verejný reťazec isNumberPrime (@RequestParam ("number") celé číslo) {return Integer.parseInt (number)% 2 == 0? "Párny Nepárny"; }}

2.1. Maven závislosti

Pre našu stranu výrobcov budeme potrebovať overovateľ kontraktu jarnej oblačnosti závislosť:

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

A budeme sa musieť nakonfigurovať spring-cloud-contract-maven-plugin s názvom našej základnej testovacej triedy, ktorú si popíšeme v nasledujúcej časti:

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

2.2. Nastavenie na strane výrobcu

Musíme do testovacieho balíka pridať základnú triedu, ktorá načíta náš jarný kontext:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @DirtiesContext @AutoConfigureMessageVerifier verejná trieda BaseTestClass {@Autowired private EvenOddController evenOddController; @Before public void setup () {StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup (evenOddController); RestAssuredMockMvc.standaloneSetup (standaloneMockMvcBuilder); }}

V / src / test / zdroje / zmluvy / balíček, pridáme testovacie pahýly, napríklad tento v súbore shouldReturnEvenWhenRequestParamIsEven.groovy:

import org.springframework.cloud.contract.spec.Contract Contract.make {description "by sa mal vrátiť, aj keď je zadanie čísla rovnomerné" request {method GET () url ("/ validate / prime-number") {queryParameters {parameter (" number "," 2 ")}}} response {body (" Even ") status 200}} 

Keď spustíme zostavenie, plugin automaticky generuje testovaciu triedu s názvom ContractVerifierTest ktorý rozširuje našu BaseTestClass a vloží to / cieľ / vygenerované-testovacie zdroje / zmluvy /.

Názvy testovacích metód sú odvodené od predpony „potvrdiť_" spojené s názvami našich testovacích pahýľov Groovy. Pre vyššie uvedený súbor Groovy bude vygenerovaný názov metódy „Validate_shouldReturnEvenWhenRequestParamIsEven“.

Poďme sa pozrieť na túto automaticky generovanú testovaciu triedu:

public class ContractVerifierTest extends BaseTestClass {@Test public void validate_shouldReturnEvenWhenRequestParamIsEven () throws Exception {// given: MockMvcRequestSpecification request = given (); // when: ResponseOptions response = given (). spec (request) .queryParam ("number", "2") .get ("/ validate / prime-number"); // potom: assertThat (response.statusCode ()). isEqualTo (200); // a: String responseBody = response.getBody (). asString (); assertThat (responseBody) .isEqualTo ("párne"); } 

Zostava tiež pridá nádobu so stubom v našom miestnom úložisku Maven, aby ju mohol použiť náš spotrebiteľ.

Pahýly budú prítomné vo výstupnom priečinku pod pahýly / mapovanie /.

3. Spotrebiteľ - strana klienta

Spotrebiteľská strana nášho CDC bude konzumovať útržky generované výrobnou stranou prostredníctvom interakcie HTTP udržiavať zmluvu, takže akékoľvek zmeny na strane výrobcu by porušili zmluvu.

Pridáme BasicMathController, ktorý vykoná požiadavku HTTP na získanie odpovede z vygenerovaných stubov:

@RestController verejná trieda BasicMathController {@Autowired private RestTemplate restTemplate; @GetMapping ("/ vypočítať") public String checkOddAndEven (@RequestParam ("number") celé číslo) {HttpHeaders httpHeaders = nový HttpHeaders (); httpHeaders.add ("Content-Type", "application / json"); ResponseEntity responseEntity = restTemplate.exchange ("// localhost: 8090 / validate / prime-number? Number =" + number, HttpMethod.GET, nový HttpEntity (httpHeaders), String.class); návrat responseEntity.getBody (); }}

3.1. The Maven Dependencies

Pre našich spotrebiteľov budeme musieť pridať spring-cloud-contract-wiremock a spring-cloud-contract-stub-runner závislosti:

 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. Spotrebiteľské nastavenie

Teraz je čas nakonfigurovať nášho stub runnera, ktorý bude informovať nášho spotrebiteľa o dostupných stuboch v našom miestnom úložisku Maven:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment. producent: +: stubs: 8090 ") public class BasicMathControllerIntegrationTest {@Autowired private MockMvc mockMvc; @Test public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven () vyvolá výnimku {mockMvc.perform (MockMvcRequestBuilders.get ("/ vypočítať? Číslo = 2") .contentType (MediaType.APPLICATION_JSON)) ()) ()) () ()) () () () .reťazec ("Párny")); }}

Všimnite si, že ids majetok @AutoConfigureStubRunner anotácia špecifikuje:

  • com.baeldung.spring.cloud - groupId nášho artefaktu
  • spring-cloud-contract-producent - artifactId výrobcu stub jar
  • 8090 - port, na ktorom budú bežať vygenerované pahýly

4. Keď dôjde k porušeniu zmluvy

Ak urobíme na strane výrobcu nejaké zmeny, ktoré majú priamy dopad na zmluvu bez toho, aby sme aktualizovali stranu spotrebiteľa, môže to mať za následok zlyhanie zmluvy.

Predpokladajme napríklad, že zmeníme EvenOddController vyžiadať URI na / overiť / zmeniť / prvočíslo na strane našich výrobcov.

Pokiaľ nášho spotrebiteľa o tejto zmene neinformujeme, pošle spotrebiteľ svoju žiadosť ďalej / overiť / prvočíslo URI a testovacie prípady na strane spotrebiteľa sa hodia org.springframework.web.client.HttpClientErrorException: 404 nenájdené.

5. Zhrnutie

Videli sme, ako nám Spring Cloud Contract môže pomôcť udržiavať zmluvy medzi zákazníkom a výrobcom služieb, aby sme mohli vytlačiť nový kód bez obáv z porušenia zmlúv.

A ako vždy, úplnú implementáciu tohto tutoriálu nájdete na GitHub.