SpringCloud 生產(chǎn)者端(欺詐檢測服務(wù)器)

2023-12-06 17:16 更新

作為欺詐檢測服務(wù)器(貸款發(fā)放服務(wù)的服務(wù)器)的開發(fā)人員:

創(chuàng)建一個初始實現(xiàn)。

提醒一下,您可以在此處看到初始實現(xiàn):

@RequestMapping(value = "/fraudcheck", method = PUT)
public FraudCheckResult fraudCheck(@RequestBody FraudCheck fraudCheck) {
return new FraudCheckResult(FraudCheckStatus.OK, NO_REASON);
}

接管請求請求。

$ git checkout -b contract-change-pr master
$ git pull https://your-git-server.com/server-side-fork.git contract-change-pr

您必須添加自動生成的測試所需的依賴項:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-contract-verifier</artifactId>
	<scope>test</scope>
</dependency>

在Maven插件的配置中,傳遞packageWithBaseClasses屬性

<plugin>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-contract-maven-plugin</artifactId>
	<version>${spring-cloud-contract.version}</version>
	<extensions>true</extensions>
	<configuration>
		<packageWithBaseClasses>com.example.fraud</packageWithBaseClasses>
		<convertToYaml>true</convertToYaml>
	</configuration>
</plugin>

 本示例通過設(shè)置packageWithBaseClasses屬性使用“基于約定”的命名。這樣做意味著最后兩個軟件包組合在一起以成為基礎(chǔ)測試類的名稱。在我們的案例中,合同位于src/test/resources/contracts/fraud下。由于從contracts文件夾開始沒有兩個軟件包,因此僅選擇一個,應(yīng)該為fraud添加后綴Base,并大寫fraud這將為您提供FraudBase測試類名稱。

所有生成的測試都擴展了該類。在那邊,您可以設(shè)置Spring上下文或任何必需的內(nèi)容。在這種情況下,請使用Rest Assured MVC啟動服務(wù)器端FraudDetectionController。

/*
 * Copyright 2013-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.fraud;

import io.restassured.module.mockmvc.RestAssuredMockMvc;
import org.junit.Before;

public class FraudBase {

	@Before
	public void setup() {
		RestAssuredMockMvc.standaloneSetup(new FraudDetectionController(),
				new FraudStatsController(stubbedStatsProvider()));
	}

	private StatsProvider stubbedStatsProvider() {
		return fraudType -> {
			switch (fraudType) {
			case DRUNKS:
				return 100;
			case ALL:
				return 200;
			}
			return 0;
		};
	}

	public void assertThatRejectionReasonIsNull(Object rejectionReason) {
		assert rejectionReason == null;
	}

}

現(xiàn)在,如果您運行./mvnw clean install,則會得到以下內(nèi)容:

Results :

Tests in error:
  ContractVerifierTest.validate_shouldMarkClientAsFraud:32 ? IllegalState Parsed...

發(fā)生此錯誤的原因是您有一個新合同,從中生成了一個測試,但由于未實現(xiàn)該功能而失敗了。自動生成的測試如下所示:

@Test
public void validate_shouldMarkClientAsFraud() throws Exception {
    // given:
        MockMvcRequestSpecification request = given()
                .header("Content-Type", "application/vnd.fraud.v1+json")
                .body("{\"client.id\":\"1234567890\",\"loanAmount\":99999}");

    // when:
        ResponseOptions response = given().spec(request)
                .put("/fraudcheck");

    // then:
        assertThat(response.statusCode()).isEqualTo(200);
        assertThat(response.header("Content-Type")).matches("application/vnd.fraud.v1.json.*");
    // and:
        DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
        assertThatJson(parsedJson).field("['fraudCheckStatus']").matches("[A-Z]{5}");
        assertThatJson(parsedJson).field("['rejection.reason']").isEqualTo("Amount too high");
}

如果您使用了Groovy DSL,則可以看到value(consumer(…?), producer(…?))塊中存在的合同的所有producer()部分都已注入到測試中。如果使用YAML,則同樣適用于responsematchers部分。

請注意,在生產(chǎn)者方面,您也在執(zhí)行TDD。期望以測試的形式表達。此測試使用合同中定義的URL,標頭和正文向我們自己的應(yīng)用程序發(fā)送請求。它還期望響應(yīng)中精確定義的值。換句話說,您擁有red,greenrefactorred部分。現(xiàn)在是將red轉(zhuǎn)換為green的時候了。

編寫缺少的實現(xiàn)。

因為您知道預(yù)期的輸入和預(yù)期的輸出,所以可以編寫缺少的實現(xiàn):

@RequestMapping(value = "/fraudcheck", method = PUT)
public FraudCheckResult fraudCheck(@RequestBody FraudCheck fraudCheck) {
if (amountGreaterThanThreshold(fraudCheck)) {
	return new FraudCheckResult(FraudCheckStatus.FRAUD, AMOUNT_TOO_HIGH);
}
return new FraudCheckResult(FraudCheckStatus.OK, NO_REASON);
}

再次執(zhí)行./mvnw clean install時,測試通過。由于Spring Cloud Contract Verifier插件將測試添加到generated-test-sources中,因此您實際上可以從IDE中運行這些測試。

部署您的應(yīng)用程序。

完成工作后,即可部署更改。首先,合并分支:

$ git checkout master
$ git merge --no-ff contract-change-pr
$ git push origin master

您的CI可能會運行類似./mvnw clean deploy之類的東西,它將同時發(fā)布應(yīng)用程序和存根工件。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號