我们的 Java 应用程序有许多实现通用接口(interface)的模块。通过设计,每个模块都封装良好且可互换。所有进出的调用都通过一小组接口(interface)进行。
我们需要检测这个机制来添加,
- 以结构化格式记录方法调用和结果
- 在调试问题或测试修复时,对模块重放这些调用。
- (最好有)使用记录的交互作为“预期”结果,在运行 JUnit 测试时将它们与“实际”进行比较。
- (可能应该)完全线程安全。
有推荐的选项吗?
我浏览了几个选项:
- Chronon - 看起来像是一个不同的概念。 'No code of your program is being executed when you playback the recordings'
- 关于 JSnoopy 的一些学术论文, SCARPE ;这些似乎不是公共(public)项目?
- 手写,例如使用 AspectJ 捕获调用 - 应该可以,但我想知道是否有现成的东西。
最佳答案
假设您非常严格地遵守您的一小组接口(interface),那么您可以使用执行以下操作的包装器对象:
- 实现接口(interface)
- 记录/记录输入
- 将调用委托(delegate)给底层对象
- 记录/记录结果
- 返回结果给调用者
您还可以修改工厂方法以返回包装对象而不是底层对象,以便这些包装器的使用相当透明。
请注意,您需要非常小心参数的可变性:理想情况下,所有参数都是不可变的,但如果不是,则需要进行深拷贝(可能通过序列化)。
从理论上讲,您还可以使用记录的输入来启用回放和/或测试....但我对对此期望过高持谨慎态度,因为回放需要您捕获所有相关状态(包括外部状态,如数据库事务、文件系统访问等)。一般来说,这很难实现,尽管您可能能够在您的特定情况下使其工作。
关于java - 记录/重放 Java 方法调用的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9832553/