我在董事会潜伏了很长时间,不用说你们是最棒的,我很感激你们挽救了我的工作。这是我第一次在这里发帖,希望不要搞砸。
我正在为 Linux(虚拟化 Ubuntu 16.04 amd_64)编写 C++ Boost 应用程序,并使用 Turtle Mock 作为模拟框架,使用 Boost Test 作为测试框架。当我尝试测试使用依赖注入技术的类时,我会模拟需要提供给测试类的类,以便验证它们的调用顺序。到目前为止一切顺利,但问题来了。我正在使用 MOCK_BASE_CLASS(MockAClass, AClass) 来覆盖真实 AClass 的虚拟方法,并使用新的 MockAClass 继续我的测试。假设 AClass 有一个虚方法 int getTest(int),而 MockAClass 有 MOCK_METHOD(getTest, 1, int(int)),在为 MockAClass 对象的 getTest 方法设置期望和返回值后,调用该方法,期望在大多数情况下是 MOCK_EXPECT(objMockAClass.getTest)。at_least(1) 永远不会被验证。我可以控制返回值,但调用永远不会在发生时得到验证。这仅在函数返回值时发生(例如,如果函数为 void getTest(int) 则验证将通过)。
我附上了我的问题的一个简单 PoC,它将在我的系统上失败。
class AClass
{
public:
virtual int getTest(int a) {return 0}
}
MOCK_BASE_CLASS (MockAClass, AClass)
{
MOCK_METHOD(getTest, 1, int(int));
}
BOOST_AUTО_TEST_CASE(SomeClassFunctionality)
{
MockAClass objMockAClass;
MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);
objMockAClass.getTest(1);
}