HippoMocks - 如何模拟Win32 API函数

3

2
那个项目看起来已经停滞不前了。你确定要依赖它吗? - David Heffernan
是的,看起来是这样。你知道有没有同样功能的替代品? - goto
1个回答

4

我需要发布一个新版本,这是确定的。

您可以像模拟任何其他函数一样模拟API函数,只是您不需要指定要调用它的对象(因为它没有)。我在Linux上使用常规的libc API函数进行了大量测试,效果非常好。Windows也应该没有什么不同,但这就是为什么我的示例将是exit的原因:

void test() {
    MockRepository mocks;
    mocks.ExpectCallFunc(&exit).With(2).Throw(std::exception());
}

请注意,这适用于任何函数,包括那些被指定为不返回的函数。如果您告诉HippoMocks模拟一个不应返回的函数,则可能没有生成返回代码,从而导致错误。请尝试抛出一个特定于测试的异常。现在我想起来了,那是在使用VS2008的Windows上,它除了调用exit之外没有任何操作码。
希望你能让它工作。请确保获取Git上最新提交(来自Assembla),因为最新版本尚未包含此功能。

请问您能否尽快发布一个版本,因为从SVN更新的代码在VS2010上无法编译。同时,它还提示ExpectCall()需要两个参数。我在第一个参数中给出了NULL。其中一个错误是: error C2784: 'TCall<Y,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P> &MockRepository::RegisterExpect_(Z2 ,Y (__thiscall Z:: )(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) const,const char *,const char *,unsigned long)' : 无法从'int'推断出'Z2 *'的模板参数。 mocks.ExpectCall(NULL, CreateFileMapping).Return(INVALID_HANDLE_VALUE); - goto
HippoMocksTest解决方案在VS2008和VS2010的调试和发布模式下编译并通过了所有48个测试。因此,我在使用ExpectCall()的方式上存在问题。如果我按照你的示例编写代码,编译器会报错“宏'ExpectCall'的实际参数不足”。 - goto
让我再检查一下,我可能不得不对其进行更改,因为显然无法重载宏。对于析构函数(因为您无法获取析构函数的地址,但可以模拟它),有ExpectCallDestructor;对于常规虚成员函数,则使用ExpectCall;而对于扁平函数,则使用ExpectCallFunc。 - dascandy
是的,我的错。测试本身在这里:http://www.assembla.com/code/hippomocks/git/nodes/master/HippoMocksTest/test_cfuncs.cpp。它有一个本地函数,它将其替换为另一个返回值。 - dascandy
我正在创建一个包装Windows API函数的静态方法类。你能给我举个例子吗? - goto
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接