1

我在董事会潜伏了很长时间,不用说你们是最棒的,我很感激你们挽救了我的工作。这是我第一次在这里发帖,希望不要搞砸。

我正在为 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);

}
4

2 回答 2

1
MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);

这其实是两个期待。第一个表示“每次调用 getTest 时返回 1”,第二个表示“必须至少调用一次 getTest”。问题是第一个将始终匹配,因此第二个将没有机会被触发。

于 2016-10-06T11:20:15.620 回答
0

Т如果将单独的 EXPECT 语句组合成一个完整的 EXPECT 语句,问题就解决了。

MOCK_EXPECT(objMockAClass.getTest).at_least(1).returns(1);- 这将使示例按计划工作。

问候,

于 2016-10-06T10:04:37.927 回答