我正在使用Gtest和Gmock进行C++的单元测试,针对两个dll:A.dll和B.dll。它们都是用C语言编写的,我不能对它们进行修改。
A.dll的`init`函数通过函数指针使用B.dll的函数作为参数。我希望模拟B的函数(因为它们是硬件相关的)。
我为A.dll创建了一个测试装置类,该类动态加载`init`和`calc`函数。以下代码简要介绍了感兴趣的函数内容:
A.dll的`init`函数通过函数指针使用B.dll的函数作为参数。我希望模拟B的函数(因为它们是硬件相关的)。
我为A.dll创建了一个测试装置类,该类动态加载`init`和`calc`函数。以下代码简要介绍了感兴趣的函数内容:
class TestFixture : public ::testing::Test {
// dynamically loads functions from A.dll and assigns
// them to function pointers init_ptr and calc_ptr.
};
// function pointer typedef for use with B.dll's functions
typedef int (*funcPtr)(int, int);
// Loaded from A.dll
void init(funcPtr func1, funcPtr func2) {
// internally set functions in A.dll to be used in calculate
}
// Loaded from A.dll
int calculate(int a, int b) {
// returns a+b + a+b
return func1(func2(a,b), func2(a,b));
}
// Inside B.dll, should be mocked
int add(int a, int b) { return a+b; }
// Dummy class for B.dll
class B {
virtual ~B() {}
virtual int add(int a, int b) = 0;
};
class MockB : public B {
virtual ~MockB() {}
MOCK_METHOD(int, add, (int a, int b));
};
// Following example test run is the goal:
TEST_F(TestFixture, AddTest) {
MockB b;
// want to use mocked add function here
init_ptr(mockedAdd, mockedAdd);
EXPECT_CALL(b, add(_,_)).Times(3);
EXPECT_EQ(calc_ptr(2,3), 10);
}
当我尝试创建一个虚拟类B和一个MockB类时,我无法将模拟方法分配给函数指针,这是init_ptr(funcPtr, funcPtr)
所需的。是否有一种使用Gmock(或类似框架)实现这一点的方法?