spring cloud contract 使用
消費端
spring cloud contract 使用 consumer
[https://docs.spring.io/spring-cloud-contract]
使用步驟
- pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
<scope>test</scope>
</dependency>
- 執(zhí)行編輯
./mvnw clean install -DskipTests
- 測試類如下
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringcloudContractConsumerApplication.class,webEnvironment= SpringBootTest.WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = {"org.xzg:scc-pruducer:+:stubs:8800"},
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class LoanApplicationServiceTests {
@Autowired
private RestTemplate restTemplate;
@Test
public void shouldBeRejectedDueToAbnormalLoanAmount() throws IOException {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Type", "application/json");
ResponseEntity<String> response = restTemplate.exchange("http://localhost:8800/fraudcheck", HttpMethod.PUT,
new HttpEntity<>("{\"client.id\":\"1234567890\",\"loanAmount\":99999}", httpHeaders),String.class);
assertThat(response.getBody()).isEqualTo("{\"fraudCheckStatus\":\"FRAUD\",\"rejection.reason\":\"Amount too high\"}");
}
}
4 .執(zhí)行查看結(jié)果
注意事項
- 如果報錯No stubs or contracts were found for [XXX]锁摔,可能是當(dāng)前maven環(huán)境變量找的倉庫不對侣签,需要指定正確地址 idea啟動配置環(huán)境變量org.apache.maven.user-settings=xxx\settings.xml
- 關(guān)于ids也需要指定正確:groupId:artifactId
- 端口為stub端口乍钻,客戶端調(diào)用要一致
kafka scc測試部分
需要 spring-kafka-test 依賴)
通過Kafka集成厘贼,為了輪詢單個消息当犯,我們需要在Spring上下文啟動時注冊consumer 赘方。這可能會導(dǎo)致一種情況绊茧,當(dāng)您在consumer 方面時,Stub Runner可以為相同的組ID和主題注冊其他使用者首懈。
這可能會導(dǎo)致這樣一種情況,即只有一個組件會實際輪詢該消息谨敛。由于在消費者方面究履,您同時具有Spring Cloud Contract Stub Runner和Spring Cloud Contract Verifier類路徑,因此我們需要能夠關(guān)閉此類行為脸狸。這是通過stubrunner.kafka.initializer自動完成的最仑。
enabled標(biāo)志,它禁用了Contact Verifier消費者注冊炊甲。如果您的應(yīng)用程序既是Kafka消息的使用者又是生產(chǎn)者盯仪,則可能需要在生成的測試的基類中將該屬性手動切換為false。
使用步驟
- 增加pom
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>4.0.3</version>
<scope>test</scope>
</dependency>
- 增加測試配置
server:
port: 8880
logging.level.org.springframework.cloud.contract: debug
#stubrunner:
# repository-root: stubs:classpath:/stubs/
# ids: my:stubs
# stubs-mode: remote
#kafka:
# initializer:
# enabled: true
spring:
kafka:
bootstrap-servers: 127.0.0.1:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
consumer:
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
max:
poll:
interval:
ms: 900000
- 編寫測試類
@SpringBootTest(classes = SpringcloudContractConsumerApplication.class,webEnvironment= SpringBootTest.WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = "org.xzg:scc-pruducer", stubsMode = StubRunnerProperties.StubsMode.LOCAL)
@EmbeddedKafka(partitions = 1,topics = {"kafka_topic"},ports = 9092)
@ActiveProfiles("test")
@Slf4j
public class ConsumerKafkaTest {
@Autowired StubTrigger trigger;
@Test
public void consumerNoInput() {
// Trigger by Label
this.trigger.trigger("some_label");
// Trigger by Group and Artifact IDs
// trigger.trigger('org.springframework.cloud.contract.verifier.stubs:streamService', 'return_book_1')
// Trigger by Artifact IDs
// trigger.trigger('streamService', 'return_book_1')
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
BDDAssertions.then(KafkaConsumer.msg).isNotNull();
BDDAssertions.then(KafkaConsumer.msg.getPayload().getBookName()).contains("foo");
BDDAssertions.then(KafkaConsumer.msg.getHeaders().get("BOOK-NAME"))
.isEqualTo("foo");
}
}
- 執(zhí)行測試觀察結(jié)果
[示例源碼地址](xiongzhenggang/spring-cloud-contract-example (github.com)
)