使用 Citrus 模拟 SFTP 和 Kafka 以进行集成测试 Spring-启动基于 apache-camel xml 的路由?
Using Citrus to mock SFTP and Kafka for Integration Testing Spring-Boot apache-camel xml based routes?
我正在使用使用 Apache Camel spring-xml 路由编写的 Spring 启动应用程序。很少有基于 java 的应用程序逻辑,它几乎完全是用 xml 编写的,并且基于各种骆驼路线。
路由被配置为通过 属性 文件连接到不同的环境和系统,使用 属性 例如 KAFKA_URL and KAFKA_PORT
。在其中一个实现的路由中,应用程序连接以下内容并向其发送 consumes/produces 消息:
<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}}}}&kerberosRenewJitter=1&kerberosRenewWindowFactor=1&{{kafka.ssl.props}}&{{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&fileExist=Append&password={{env:FTP_PASSWORD:{{FTP_PASSWORD}}}}&delay={{env:FTP_POLL_DELAY:{{FTP_POLL_DELAY}}}}&username={{env:FTP_USER:{{FTP_USER}}}}"/>
在我的集成测试中,我配置了 Citrus 的 EmbeddedKafkaServer class 如下:
@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
设置为本地主机,将 FTP_URL
设置为本地主机,将 FTP_PORT
设置为 2222(其中需要的其他属性)在我的属性文件中,但这似乎没有将我连接到嵌入式集群或 sftp 服务器..
让我的 spring 启动应用程序连接到这两个模拟实例并从那里 运行 它的业务逻辑处理,我错过了什么难题?
我解决了这个问题 - 这是因为使用了非常旧的 Kafka 版本(1.0.0 或更早版本),它缺少一些在 Citrus 尝试构建新主题时调用的方法。如果有人在使用 Citrus 时遇到与此类似的问题,我建议首先评估您的服务所使用的 Kafka 版本,并确定是否需要更新它。
对于 sftp 连接,服务器或客户端未自动连接,因此从未启动。
我正在使用使用 Apache Camel spring-xml 路由编写的 Spring 启动应用程序。很少有基于 java 的应用程序逻辑,它几乎完全是用 xml 编写的,并且基于各种骆驼路线。
路由被配置为通过 属性 文件连接到不同的环境和系统,使用 属性 例如 KAFKA_URL and KAFKA_PORT
。在其中一个实现的路由中,应用程序连接以下内容并向其发送 consumes/produces 消息:
<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}}}}&kerberosRenewJitter=1&kerberosRenewWindowFactor=1&{{kafka.ssl.props}}&{{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&fileExist=Append&password={{env:FTP_PASSWORD:{{FTP_PASSWORD}}}}&delay={{env:FTP_POLL_DELAY:{{FTP_POLL_DELAY}}}}&username={{env:FTP_USER:{{FTP_USER}}}}"/>
在我的集成测试中,我配置了 Citrus 的 EmbeddedKafkaServer class 如下:
@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
设置为本地主机,将 FTP_URL
设置为本地主机,将 FTP_PORT
设置为 2222(其中需要的其他属性)在我的属性文件中,但这似乎没有将我连接到嵌入式集群或 sftp 服务器..
让我的 spring 启动应用程序连接到这两个模拟实例并从那里 运行 它的业务逻辑处理,我错过了什么难题?
我解决了这个问题 - 这是因为使用了非常旧的 Kafka 版本(1.0.0 或更早版本),它缺少一些在 Citrus 尝试构建新主题时调用的方法。如果有人在使用 Citrus 时遇到与此类似的问题,我建议首先评估您的服务所使用的 Kafka 版本,并确定是否需要更新它。
对于 sftp 连接,服务器或客户端未自动连接,因此从未启动。