有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java非嵌入式集成测试

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

更糟糕的是,在部署到prod时,我必须删除这些计数器——这很容易添加bug

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


共 (2) 个答案

  1. # 1 楼答案

    不久前,我不得不处理类似的情况。我让几个组件处理一些消息,然后将它们传递给其他组件。我想出了这个设计:

    • 每个组件都实现一个接口,该接口具有notify方法,用于通知并将接收到的消息传递给其他组件
    • 每个组件都包含一个在收到消息时需要通知的其他组件的列表
    • 在测试中,您所要做的就是创建一个虚拟处理器来实现上面定义的接口,并在所有组件中注册。这样,每当系统中出现新消息时,虚拟处理器就会收到通知。在生产环境中,不会有虚拟处理器,这将使您的代码适合于测试和生产版本
  2. # 2 楼答案

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

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

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

    • 使用或类似于上述的其他仪器技术

    • 测试副作用和输出!不要对流中的确切消息进行假设,只需查看整体结果是否正确即可。这样,您的测试更加灵活,并将重点放在正在测试的内容上。不幸的是,如果出现故障,调试将花费更多的时间