首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十七节 SCC消费驱动测试-消费端

第十七节 SCC消费驱动测试-消费端

作者头像
用户1418372
发布2021-06-01 20:54:54
4150
发布2021-06-01 20:54:54
举报
文章被收录于专栏:清晨我上码清晨我上码

spring cloud contract 使用

官方地址

消费端

spring cloud contract 使用 consumer

[https://docs.spring.io/spring-cloud-contract]

使用步骤

  1. pom
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
    <scope>test</scope>
</dependency>
  1. 执行编辑

./mvnw clean install -DskipTests

  1. 测试类如下
@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 .执行查看结果

注意事项

  1. 如果报错No stubs or contracts were found for [XXX],可能是当前maven环境变量找的仓库不对,需要指定正确地址 idea启动配置环境变量org.apache.maven.user-settings=xxx\settings.xml
  2. 关于ids也需要指定正确:groupId:artifactId
  3. 端口为stub端口,客户端调用要一致

kafka scc测试部分

需要 spring-kafka-test 依赖)

通过Kafka集成,为了轮询单个消息,我们需要在Spring上下文启动时注册consumer 。这可能会导致一种情况,当您在consumer 方面时,Stub Runner可以为相同的组ID和主题注册其他使用者。
这可能会导致这样一种情况,即只有一个组件会实际轮询该消息。由于在消费者方面,您同时具有Spring Cloud Contract Stub Runner和Spring Cloud Contract Verifier类路径,因此我们需要能够关闭此类行为。这是通过stubrunner.kafka.initializer自动完成的。
enabled标志,它禁用了Contact Verifier消费者注册。如果您的应用程序既是Kafka消息的使用者又是生产者,则可能需要在生成的测试的基类中将该属性手动切换为false。

使用步骤

  1. 增加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>
  1. 增加测试配置
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
  1. 编写测试类
@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");
    }
}
  1. 执行测试观察结果

[示例源码地址](xiongzhenggang/spring-cloud-contract-example (github.com) )

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • spring cloud contract 使用
    • 消费端
      • spring cloud contract 使用 consumer
        • 使用步骤
        • 注意事项
      • kafka scc测试部分
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档