无法对 @KafkaListener 带注释的方法进行单元测试

2024-04-23

我正在尝试在 Spring 中对 kafka 消费者类进行单元测试。我想知道如果 kafka 消息发送到它的主题,则侦听器方法被正确调用。我的消费者类注释如下:

@KafkaListener(topics = "${kafka.topics.myTopic}")
public void myKafkaMessageEvent(final String message) { ...

如果我@Autowire消费者,当我发送kafka消息时,监听器方法被正确调用,但我不能断言该方法被调用,因为该类不是模拟。

如果我模拟消费者,当我发送 kafka 消息时,根本不会调用侦听器方法。我可以直接调用该方法,并断言它有效,但这并没有达到我想要的效果,即检查当我向其主题发送 kafka 消息时是否调用该方法。

现在我已经采取在消费者内部放置一个计数器的方法,并在每次调用侦听器方法时递增它,然后检查它的值是否已更改。对我来说,创建一个仅用于测试的变量似乎是一个糟糕的解决方案。

有没有办法让被嘲笑的消费者也收到卡夫卡消息?或者其他一些方法来断言调用了非模拟的消费者侦听器方法?


听起来您正在请求类似于 Spring AMQP 测试框架中的内容:https://docs.spring.io/spring-amqp/docs/2.0.3.RELEASE/reference/html/_reference.html#test-harness https://docs.spring.io/spring-amqp/docs/2.0.3.RELEASE/reference/html/_reference.html#test-harness

所以,如果你不擅长额外的变量,你可以借用它solution https://github.com/spring-projects/spring-amqp/tree/master/spring-rabbit-test/src/main/java/org/springframework/amqp/rabbit/test并实施你自己的“线束”。

我认为这应该是对框架的一个很好的补充,所以请提出适当的建议issue https://github.com/spring-projects/spring-kafka/issues我们可以共同为公众带来这样一个工具。

UPDATE

因此,根据 Spring AMQP 基金会,我在测试配置中执行了此操作:

public static class KafkaListenerTestHarness extends KafkaListenerAnnotationBeanPostProcessor {

    private final Map<String, Object> listeners = new HashMap<>();

    @Override
    protected void processListener(MethodKafkaListenerEndpoint endpoint, KafkaListener kafkaListener,
            Object bean, Object adminTarget, String beanName) {

        bean = Mockito.spy(bean);

        this.listeners.put(kafkaListener.id(), bean);

        super.processListener(endpoint, kafkaListener, bean, adminTarget, beanName);
    }

    @SuppressWarnings("unchecked")
    public <T> T getSpy(String id) {
        return (T) this.listeners.get(id);
    }

}

...

@SuppressWarnings("rawtypes")
@Bean(name = KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public static KafkaListenerTestHarness kafkaListenerAnnotationBeanPostProcessor() {
    return new KafkaListenerTestHarness();
}

然后在目标测​​试用例中我这样使用它:

@Autowired
private KafkaListenerTestHarness harness;
...
Listener listener = this.harness.getSpy("foo");

verify(listener, times(2)).listen1("foo");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法对 @KafkaListener 带注释的方法进行单元测试 的相关文章

随机推荐

  • 如何在Android中编写特殊字符

    我想将单位添加到我的TextView 例如幂 2 如文本行上方的小写字母 微符号 等 我怎样才能做到这一点 是的 您可以使用 Unicode 字符Textview TextView tvtext new TextView this tvTe
  • 下载NLTK数据时出现PermissionError

    我使用 Anaconda 的 Python 3 6 3 发行版 它安装了 NLTK 但没有安装我项目所需的 NLTK DATA 问题是 当我尝试安装时 nltk download I get PermissionError Errno 13
  • 如何拆分同时包含分隔符和转义分隔符的字符串?

    我的字符串分隔符是 分隔符在字符串中转义为 E g irb main 018 0 gt s a b d e gt a b d e irb main 019 0 gt s split gt a b d e 有人可以建议我正则表达式 这样 sp
  • jQuery $.live() 不适用于 iPhone 上的表格行

    我正在使用 jQuery 使表格行可点击 live 功能 可以在 Chrome Firefox 甚至桌面 Windows Safari 上完美运行 但不能在 iPhone 上运行 bind 到处都可以使用 但出于明显的原因 我想使用其他功能
  • 代码优先更改数据源,无需连接字符串

    我在创建 MVC4 应用程序时似乎遇到问题 我采用了代码优先方法来创建模型 但 web config 文件中似乎没有创建连接字符串 构建的数据库似乎是在 localhost SQLEXPRESS 实例上构建的 但我想将其更改为外部数据源 如
  • svg 中的简单填充图案:对角线阴影

    我如何填充 SVG 形状 不是使用单一颜色 图像或渐变 而是使用阴影图案 如果可能的话对角线 已经两个小时了 我什么也没发现 至少在2005年之后 我认为一个可能的破解方法是使用孵化的 PNG 作为填充 但这并不理想 我在互联网上也没有找到
  • 使用 Pandas/ExcelWriter 对单元格中的文本部分进行着色

    如何使用 pandas 数据框和 ExcelWriter 对写入 Excel 文件的部分文本进行着色 我已经设置了使用背景颜色和文本颜色以及不同内容来格式化单元格 但是您可以将格式设置仅应用于字符串 1 3 5 的单元格中的第一个逗号分隔值
  • 如何防止意外地在非常量对象上调用变异函数?

    假设我们有一个 myType 类型的对象 obj 并且我们希望将其传递给函数 Foo 该函数返回一些有关 obj 的有价值的信息 函数 Bar 是声明 obj 的地方 也是从中调用 Foo 的地方 如下所示 void Bar myType
  • Chrome 应用程序 localStorage 不持久并且 chrome.storage 不工作

    我有一个 chrome Kiosk 应用程序 我需要在机器打开和关闭之间保存数据 几个字节作为字符串 但无论我尝试什么 本地存储似乎在重新启动时都会被擦除 当我转到 chrome inspect apps 检查 Chrome 应用程序时 控
  • 合并并总结 Pandas 中的几个值计数系列

    我通常使用value counts 获取某个值出现的次数 然而 我现在处理大型数据库表 无法将其完全加载到 RAM 中 并在不到 1 个月的时间内查询数据 有没有办法存储结果value counts 并将其合并 添加到下一个结果中 我想统计
  • 数据表:根据隐藏列值隐藏行

    我在用dataTable在 jsp 中显示我的表的插件 我也想使用复选框选项 像这里的东西 数据表 根据列中的值过滤行 https stackoverflow com questions 29569492 datatables filter
  • 使用VB.NET上传文件到SFTP服务器

    我需要将文件上传到 SFTP 服务器 我正在使用 VB NET 2008 怎样才能上传一个简单的 csv使用端口号 用户名和密码等将文件从本地计算机传输到 SFTP 服务器 提前致谢 NET 常用的开源 SFTP 库是SSH NET htt
  • SFINAE 内部概念模板参数

    SFINAE 在概念论证中起作用吗 也许这里不叫SFINAE 例子 template
  • SwiftUI:类型不符合协议“UIViewRepresentable”//我的代码

    我正在开发一个新的 SwiftUI 应用程序 我正在尝试弄清楚如何使这个 Swift 项目与 SwiftUI 兼容 在此示例中 我正在开发带有方向的地图 问题是我无法使 UIViewRepresentable 工作 我收到错误 类型 Dir
  • Ruby on Rails:provide 与 content_for

    我今天遇到了视图辅助函数 provide 通过查看它的手册 我仍然对它与 content for 有何不同感到困惑 提供 名称 内容 nil 块 与 content for 相同 但与流式传输一起使用时会直接刷新 回到布局 换句话说 如果你
  • 如何在 Razor Pages 中返回带有对象的不同视图?

    在 NET Framework MVC中 我可以使用以下代码来完成 public class HomeController Controller public ActionResult Index Student student new S
  • ssrs 报告中的格式编号

    argh 受不了我自己也想不通 我在报告中的数字格式中使用了它 0 00 0 00 格式为 1 212 89 这不完全是我想要的 因为我想要 1 212 89 无论服务器的区域设置如何 所以我尝试了这个 0 00 0 00 但这给了我这个
  • 从 FeedParser 获取 Feed 并导入到 Pandas DataFrame

    我正在学习Python 作为实践 我正在使用 feedparser 构建一个 RSS 抓取器 将输出放入 pandas 数据帧并尝试使用 NLTK 进行挖掘 但我首先从多个 RSS 提要获取文章列表 我用这篇文章来了解如何传递多个提要 ht
  • CGridView 使用 Tab 时过滤重复的 Ajax 请求

    在我的 Web 应用程序中 我使用选项卡并根据 Ajax 加载部分视图 所以有可能我确实加载了相同的内容CGridView多次 无需重新加载页面 如果发生这种情况 如果我使用 我会变成重复的 Ajax 请求CGridView过滤器 过滤器和
  • 无法对 @KafkaListener 带注释的方法进行单元测试

    我正在尝试在 Spring 中对 kafka 消费者类进行单元测试 我想知道如果 kafka 消息发送到它的主题 则侦听器方法被正确调用 我的消费者类注释如下 KafkaListener topics kafka topics myTopi