记录/重放 Java 方法调用的工具
Posted
技术标签:
【中文标题】记录/重放 Java 方法调用的工具【英文标题】:Tools to record/replay Java method calls 【发布时间】:2012-03-23 00:28:49 【问题描述】:我们的 Java 应用程序有许多实现通用接口的模块。根据设计,每个模块都封装良好且可互换。所有来往/来自的调用都通过一小组接口进行。
我们需要检测这个机制来添加,
-
以结构化格式记录方法调用和结果
在调试问题或测试修复时针对模块重放这些调用。
(非常有用)将记录的交互用作“预期”结果,在运行 JUnit 测试时将它们与“实际”进行比较。
(可能应该有)完全线程安全。
有推荐的选项吗?
我看了几个选项:
Chronon - 看起来是一个不同的概念。 'No code of your program is being executed when you playback the recordings' JSnoopy,SCARPE上的一些学术论文;这些似乎不是公共项目? 手写使用 AspectJ 捕获呼叫 - 应该可以,但我想知道是否有现成的东西。【问题讨论】:
我遇到了类似的问题。可以使用testrecorder 进行录制和回放。有关详细信息,请参阅***.com/a/46680587/4497253。 @lain 你好lain,你有没有想过这个问题?我正在开发一个非常相似、几乎完全相同的功能来测试我的一些项目,如果你有任何运气,请告诉我。我手动编写了一些代码来执行此操作,但是记录广泛执行的方法以及具有许多间接类实例输入的方法非常耗时。 嗨@HuadongFeng - 不,我放弃了这个想法(并离开了那个项目)。也许 CoronA 的链接对您有用。 @lain,非常感谢您的回复,我会查看 CoronA 的回复。 【参考方案1】:假设您非常严格地遵守您的一小部分接口,那么您可以使用执行以下操作的包装器对象:
实现接口 记录/记录输入 将调用委托给底层对象 记录/记录结果 返回结果给调用者您还可以修改工厂方法以返回包装对象而不是底层对象,以便这些包装器的使用相当透明。
请注意,您需要非常小心参数的可变性:理想情况下,所有参数都是不可变的,但如果不是,您需要进行深拷贝(可能通过序列化)。
理论上,您还可以使用记录的输入来启用播放和/或测试....但我会谨慎地对此期望过高,因为播放需要您捕获所有相关状态(包括外部状态,如数据库事务、文件系统访问等)。一般来说,这很难实现,尽管您可能能够使其在您的特定情况下工作。
【讨论】:
感谢您的意见。是的,大多数代码都会依赖于外部环境状态......所以如果没有好的现成解决方案,我想这不足为奇。但也许,至少,有一些我可以重复使用的代码来帮助我构建我的......以上是关于记录/重放 Java 方法调用的工具的主要内容,如果未能解决你的问题,请参考以下文章