【问题标题】:Using Citrus to mock SFTP and Kafka for Integration Testing Spring-Boot apache-camel xml based routes?使用 Citrus 模拟 SFTP 和 Kafka 以进行基于 Spring-Boot apache-camel xml 的路由的集成测试?
【发布时间】:2019-10-30 20:52:46
【问题描述】:

我正在使用使用 Apache Camel spring-xml 路由编写的 Spring Boot 应用程序。很少有基于 java 的应用程序逻辑,它几乎完全用 xml 编写并基于各种骆驼路线。

路由被配置为通过属性文件连接到不同的环境和系统,使用诸如KAFKA_URL and KAFKA_PORT 之类的属性。在其中一个已实现的路由中,应用程序连接到以下内容并向其消费/生成消息:

<to id="route_id_replaced_for_question" uri="kafka:{{env:KAFKA_URL:{{KAFKA_URL}}}}:{{env:KAFKA_PORT:{{KAFKA_PORT}}}}?topic={{env:KAFKA_TOPIC:{{topic_to_connect_to}}}}&amp;kerberosRenewJitter=1&amp;kerberosRenewWindowFactor=1&amp;{{kafka.ssl.props}}&amp;{{kafka.encryption.props}}"/>

此外,我们连接到一个 SFTP 服务器,我也在尝试使用 Citrus 进行模拟。这遵循类似的模式,其中:

<from id="_requestFile" uri="{{env:FTP_URL:{{FTP_URL}}}}:{{env:FTP_PORT:{{FTP_PORT}}}}/{{env:FTP_FILE_DIR:{{FTP_FILE_DIR}}}}/?delete=true&amp;fileExist=Append&amp;password={{env:FTP_PASSWORD:{{FTP_PASSWORD}}}}&amp;delay={{env:FTP_POLL_DELAY:{{FTP_POLL_DELAY}}}}&amp;username={{env:FTP_USER:{{FTP_USER}}}}"/>

在我的集成测试中,我配置了 Citrus 的 EmbeddedKafkaServer 类,其中包含以下内容:

 @Bean
    public EmbeddedKafkaServer embeddedKafkaServer() {
        return new EmbeddedKafkaServerBuilder()
                .kafkaServerPort(9092)
                .topics("topic_to_connect_to")
                .build();
    }

和 Citrus FTP 服务器:

    @Bean
    public SftpServer sftpServer() {
        return CitrusEndpoints.sftp()
                .server()
                .port(2222)
                .autoStart(true)
                .user("username")
                .password("passwordtoconnectwith")
                .userHomePath("filedirectory/filestoreadfrom")
                .build();
    }

理想情况下,我的测试将连接到模拟 sftp 服务器,我将使用 Citrus 将文件推送到适当的目录,然后我的应用程序将读取、处理并发布到嵌入式 kafka 集群上的主题并验证在测试中。

我的印象是我会在我的属性文件中将KAFKA_PORT 设置为 9092 并将 KAFKA_URL 设置为 localhost,以及将 FTP_URL 设置为 localhost 并将 FTP_PORT 设置为 2222(以及所需的其他属性) ,但这似乎并没有将我连接到嵌入式集群或 sftp 服务器..

让我的 Spring Boot 应用程序连接到这两个模拟实例并从那里运行其业务逻辑处理,我缺少哪一块拼图?

【问题讨论】:

  • 这不仅仅是关于端口,您还需要确保使用正确的用户和密码来连接到那些模拟的服务器。此外,最好知道您如何运行测试以及错误消息/堆栈跟踪是什么样的。
  • 在我的骆驼路由中连接时,我提供了与 SftpServer 相同的用户名和密码(因此,在本例中,用户名和密码用于连接)。该应用程序通常会正确连接到我们的实际 SFTP 服务器,因此我不确定该代码是否存在问题。现在我有一个非常简单的测试运行,启动 Spring Boot 应用程序(作为测试的常规部分),然后打印出“你好,世界!”并断言 1==1。在检查日志时,堆栈跟踪调用无法连接到两者,而通常它会打印出“以用户 ____ 身份连接到 sftp 服务器”
  • WARN o.a.c.c.file.remote.SftpConsumer - 自动创建目录时出错:filedirectory/filestoreadfrom 由于无法连接到 sftp://username@localhost:2222。忽略此异常。 org.apache.camel.component.file.GenericFileOperationFailedException:无法连接到 sftp://username@localhost:2222 原因:com.jcraft.jsch.JSchException:java.net.ConnectException:连接被拒绝(连接被拒绝)

标签: spring-boot apache-camel integration-testing citrus-framework


【解决方案1】:

我解决了这个问题 - 这是由于使用了非常旧的 Kafka 版本(1.0.0 或更早版本),它缺少一些在 Citrus 尝试构建新主题时调用的方法。如果有人在使用 Citrus 时遇到与此类似的问题,我建议先评估您的服务所在的 Kafka 版本,并确定是否需要更新。

对于 sftp 连接,服务器或客户端没有被自动连接,因此永远不会启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2015-03-23
    • 2017-03-28
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多