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.