Bevezetés a tavaszi felhő szerződésbe

1. Bemutatkozás

A Spring Cloud Contract egy olyan projekt, amely egyszerűen fogalmazva segít nekünk megírni a fogyasztók által vezérelt szerződéseket (CDC).

Ez biztosítja a szerződést a Termelő és a Fogyasztó, elosztott rendszerben - HTTP és üzenet alapú interakciókhoz egyaránt.

Ebben a rövid cikkben a Spring Cloud Contract gyártói és fogyasztói oldali teszteseteinek feltárását vizsgáljuk HTTP interakción keresztül.

2. Producer - kiszolgálói oldal

Produceroldali CDC-t fogunk írni egy EvenOddController - ami csak azt mondja el, hogy a szám paraméter páros vagy páratlan:

@RestController public class EvenOddController {@GetMapping ("/ validate / prime-number") public String isNumberPrime (@RequestParam ("number") Egész szám) {return Integer.parseInt (szám)% 2 == 0? "Páros Páratlan"; }}

2.1. Maven-függőségek

Termelői oldalunkra szükségünk lesz a tavasz-felhő-induló-szerződés-hitelesítő függőség:

 org.springframework.cloud spring-cloud-starter-contract-verifier 2.1.1.FELHASZNÁLÁSI teszt 

És konfigurálnunk kell tavasz-felhő-szerződés-maven-plugin az alap teszt osztályunk nevével, amelyet a következő szakaszban ismertetünk:

 org.springframework.cloud spring-cloud-contract-maven-plugin 2.1.1. FELHASZNÁLÁS true com.baeldung.spring.cloud.springcloudcontractproducer.BaseTestClass 

2.2. Gyártói oldal beállítása

A tesztcsomagba hozzá kell adnunk egy alaposztályt, amely betölti a tavaszi kontextust:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @DtiesContext @AutoConfigureMessageVerifier public class BaseTestClass {@Autowired private EvenOddController evenOddController; @A nyilvános void beállítása előtt () {StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup (evenOddController); RestAssuredMockMvc.standaloneSetup (standaloneMockMvcBuilder); }}

Ban,-ben / src / test / erőforrások / szerződések / csomagot, hozzáadjuk a tesztcsonkokat, mint például ez a fájlban shouldReturnEvenWhenRequestParamIsEven.groovy:

import org.springframework.cloud.contract.spec.Contract Contract.make {description "vissza kell térnie akkor is, ha a számbemenet páros" request {method GET () url ("/ validate / prime-number") {queryParameters {paraméter (" szám "," 2 ")}}} válasz {test (" Páros ") állapot 200}} 

Amikor lefuttatjuk az építést, a plugin automatikusan létrehoz egy teszt osztályt ContractVerifierTest hogy kiterjeszti a mi BaseTestClass és beteszi / target / generált-teszt-források / szerződések /.

A vizsgálati módszerek neve a „érvényesít_" összefűzve Groovy tesztcsonkjaink nevével. A fenti Groovy fájl esetében a létrehozott metódus neve a következő lesz: “Validate_shouldReturnEvenWhenRequestParamIsEven”.

Vessünk egy pillantást erre az automatikusan létrehozott tesztosztályra:

public class ContractVerifierTest kiterjeszti a BaseTestClass {@Test public void validate_shouldReturnEvenWhenRequestParamIsEven () dob kivételt {// adott: MockMvcRequestSpecification request = megadott (); // mikor: ResponseOptions válasz = adott (). spec (kérés) .queryParam ("szám", "2") .get ("/ érvényesítés / főszám"); // majd: assertThat (response.statusCode ()). isEqualTo (200); // és: String responseBody = response.getBody (). asString (); assertThat (responseBody) .isEqualTo ("Even"); } 

A build egyúttal hozzáadja a helyi edényt a helyi Maven-tárunkhoz, hogy a fogyasztóink is használhassák.

A csomók a kimeneti mappában lesznek csonkok / térképezés /.

3. Fogyasztó - ügyféloldal

CDC fogyasztói oldala a termelői oldal által generált csonkokat fogja fogyasztani HTTP interakció révén fenntartani a szerződést, tehát a termelői oldalon bekövetkező bármilyen változás felmondaná a szerződést.

Hozzátesszük BasicMathController, amely HTTP kérést fog kérni a válasz létrehozására a létrehozott csonkokból:

@RestController public class BasicMathController {@Autowired private RestTemplate restTemplate; @GetMapping ("/ calc") public String checkOddAndEven (@RequestParam ("szám") Egész szám) {HttpHeaders httpHeaders = new HttpHeaders (); httpHeaders.add ("Tartalom-típus", "alkalmazás / json"); ResponseEntity responseEntity = restTemplate.exchange ("// localhost: 8090 / validate / prime-number? Number =" + szám, HttpMethod.GET, új HttpEntity (httpHeaders), String.class); return responseEntity.getBody (); }}

3.1. A Maven-függőségek

Fogyasztónk számára hozzá kell adnunk a tavasz-felhő-szerződés-drótdísz és tavasz-felhő-szerződés-csonka-futó függőségek:

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

3.2. Fogyasztói oldal beállítása

Itt az ideje beállítani a csonk futót, amely tájékoztatja fogyasztóinkat a helyi Maven-tárunkban elérhető csonkokról:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @AutoConfigureJsonTesters @AutoConfigureStubRunner (stubsMode = StubRunnerProperties.StubsMode.LOCAL, ids = „com.baeldung.spring.cloud:spring-cloud-contract- producer: +: stubs: 8090 ") public class BasicMathControllerIntegrationTest {@Autowired private MockMvc mockMvc; @Test public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven () dobja a Kivételt {mockMvc.perform (MockMvcRequestBuilders.get ("/ kiszámítja? Szám = 2") .ContentType (MediaType.APPLICATION_JSON) (.xp) (.xp). (). húr ("Páros")); }}

Vegye figyelembe, hogy a azonosítók tulajdona @AutoConfigureStubRunner a kommentár meghatározza:

  • com.baeldung.spring.cloud - a groupId műtárgyunk
  • tavasz-felhő-szerződés-producer - a artefactId a termelő csonkja
  • 8090 - az a port, amelyen a létrehozott csonkok futni fognak

4. Amikor a szerződés megszakad

Ha olyan változtatásokat hajtunk végre a termelői oldalon, amelyek közvetlenül érintik a szerződést a fogyasztói oldal frissítése nélkül, ez szerződésszegést eredményezhet.

Tegyük fel például, hogy változtatnunk kell a EvenOddController kérjen URI-t a / validate / change / prime-number termelői oldalunkon.

Ha nem tájékoztatjuk fogyasztóinkat erről a változásról, a fogyasztó továbbra is megküldi kérését a / validate / prime-number URI, és a fogyasztói oldal tesztjei dobnak org.springframework.web.client.HttpClientErrorException: 404 nem található.

5. Összefoglalás

Láttuk, hogy a Tavaszi Felhőszerződés hogyan tud segíteni bennünket a szolgáltatási fogyasztó és a gyártó közötti szerződések fenntartásában, hogy új kódot tudjunk kihúzni anélkül, hogy aggódnánk a szerződések megszegése miatt.

És mint mindig, ennek az oktatóanyagnak a teljes megvalósítása megtalálható a GitHubon.