3

我正在为消息传递系统编写集成测试。大多数测试在流程的各个阶段收集消息及其端到端的各种代码路径的计数。我目前进行的测试变得过于侵入性,因为我public static AtomicInteger在这些消息传递组件中有很多 s - 我在处理消息时增加它们 - 然后测试对这些计数进行断言。

更糟糕的是,在部署产品时,我将不得不删除这些计数器——这很容易添加错误。

如何设计我的测试,以便获得通过这些组件的消息计数,而实际上不需要在我的类中填充计数器?我正在考虑对真实组件进行子类化并覆盖方法,并在子类方法中移动计数器 - 并在我的测试中使用这些子类 - 关于更好的设计还有其他想法吗?

4

2 回答 2

1

前段时间我不得不处理完全相同的情况。我有几个组件处理一些消息,然后将它们传递给其他组件。我想出了这个设计:

  • 每个组件都实现了一个接口,该接口具有notify用于通知并将接收到的消息传递给其他组件的方法
  • 每个组件都包含一个在收到消息时需要通知的其他组件的列表
  • 在您的测试中,您所要做的就是创建一个虚拟处理器来实现上面定义的接口并在您的所有组件中注册。这样,每当有新消息流入您的系统时,虚拟处理器就会收到通知。在生产中,不会有虚拟处理器,这应该使您的代码适合测试和生产版本。
于 2012-07-06T17:38:55.113 回答
1

AtomicInteger用仅在测试中使用的 static 分散您的代码肯定是一个坏主意。以下是我推荐的几种方法:

  • 使用中间件中可用的或其他监控机制以非侵入方式读取消息计数

  • 添加在所有组件中安装侦听器的可能性。在生产环境中使用null或空对象模式,而在测试中安装一些简单的侦听器来计算调用/消息。会帮助你。

  • 使用或其他仪器技术,类似于上面。

  • 测试副作用和输出!不要对流中的确切消息做出假设,只看整体结果是否正确。这样,您的测试就更加灵活,并专注于正在测试的内容。不幸的是,当出现问题时,调试将需要更多时间。

于 2012-07-06T17:28:30.813 回答