delphi - 更换功能单元

标签 delphi unit-testing

我正在为大型 Delphi 代码库编写单元测试基础结构。我想将对 SysUtils.FileExists 中的纯函数的调用链接到“MockSysUtils.FileExists”。

编译器不支持创建具有相同接口(interface)的 SysUtils 单元。

我正在考虑的是在运行时 Hook 我的模拟函数。现在这可能吗?

还有其他建议吗?

问候,

彼得

最佳答案

运行时替换函数很困难,但通常在技术上是可行的。您需要做的“全部”是:

  • 获取相关函数的地址
  • 反汇编前 5 个字节左右(以检查 RET 指令 - 非常小的例程可能会与另一个例程相邻,从而阻止您替换它)
  • 将其页面保护(使用 VirtualProtect )更改为可写
  • 使用 JMP rel32 指令重写前 5 个字节(即 E9 )
  • 正常实现您的版本函数,确保它与您正在模拟的函数具有相同的参数和调用约定

更简单的方法是链接不同版本的 SysUtils.pas。这还需要您重新编译 RTL 和 VCL 中依赖于 SysUtils.pas 的所有单元,但这可能比上面描述的函数检测方法容易得多。

最简单的方法是语言级别的方法,您要么根本不直接依赖 SysUtils(因此可以在更高级别进行切换),要么将 uses 声明修改为有条件地引用不同的单位。

关于delphi - 更换功能单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/469237/

相关文章:

delphi - 在哪里可以找到ADOExpress教程?

android - 使用 firemonkey 将照片添加到图库

delphi - TPageControl 选项卡区域 OnMouseEnter OnMouseLeave 事件

delphi - 如何更改对象检查器字体?

C# 如何强制本地化文化到 en-US 进行测试项目

java - 用 mockito 模拟单例

unit-testing - 使用来自终端的gradle for CI进行单元测试

delphi - 如何对案例进行多种变体

javascript - QUnit 多个 asyncTest 与 setTimeout

unit-testing - Grails 2.1 单元测试命令对象 mockForConstraintsTests 不工作?