Turtle Mock:如果模拟 class 方法 returns 一个值,MOCK_EXPECT 失败
Turtle Mock: MOCK_EXPECT fails if mocked class method returns a value
我在董事会潜伏了很长时间,不用说你们是最棒的,我很感激你们一直以来挽救了我的工作。这是我第一次post来这里,希望我不会搞砸。
我正在为 Linux(虚拟化 Ubuntu 16.04 amd_64)编写一个 C++ Boost 应用程序,并使用 Turtle Mock 作为模拟框架,使用 Boost Test 作为测试框架。当我尝试测试使用依赖注入技术的 class 时,我模拟了需要提供给测试 class 的 classes,这样我就可以验证它们的调用顺序。到目前为止一切顺利,但问题来了。
我正在使用 MOCK_BASE_CLASS(MockAClass, AClass) 来覆盖真实 AClass 的虚拟方法,并使用新的 MockAClass 来继续我的测试。假设 AClass 有一个虚方法 int getTest(int),而 MockAClass 有 MOCK_METHOD(getTest, 1, int(int)),在为 MockAClass 对象的 getTest 方法设置期望值和 return 值之后,并调用该方法,在大多数情况下的期望是 MOCK_EXPECT(objMockAClass.getTest).at_least(1) 永远不会被验证。我可以控制 return 值,但调用从未在发生时得到验证。只有当函数 return 是一个值时才会发生这种情况(例如,如果函数是 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);
}
如果将单独的 EXPECT 语句组合成一个完整的 EXPECT 语句,问题就解决了。
MOCK_EXPECT(objMockAClass.getTest).at_least(1).returns(1);
- 这将使示例按计划工作。
此致,
MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);
这其实是两种期待。第一个表示 'everytime getTest gets called return 1',第二个表示 'getTest must be called at least one time'。
问题是第一个总是匹配,因此第二个不会有机会被触发。
我在董事会潜伏了很长时间,不用说你们是最棒的,我很感激你们一直以来挽救了我的工作。这是我第一次post来这里,希望我不会搞砸。
我正在为 Linux(虚拟化 Ubuntu 16.04 amd_64)编写一个 C++ Boost 应用程序,并使用 Turtle Mock 作为模拟框架,使用 Boost Test 作为测试框架。当我尝试测试使用依赖注入技术的 class 时,我模拟了需要提供给测试 class 的 classes,这样我就可以验证它们的调用顺序。到目前为止一切顺利,但问题来了。 我正在使用 MOCK_BASE_CLASS(MockAClass, AClass) 来覆盖真实 AClass 的虚拟方法,并使用新的 MockAClass 来继续我的测试。假设 AClass 有一个虚方法 int getTest(int),而 MockAClass 有 MOCK_METHOD(getTest, 1, int(int)),在为 MockAClass 对象的 getTest 方法设置期望值和 return 值之后,并调用该方法,在大多数情况下的期望是 MOCK_EXPECT(objMockAClass.getTest).at_least(1) 永远不会被验证。我可以控制 return 值,但调用从未在发生时得到验证。只有当函数 return 是一个值时才会发生这种情况(例如,如果函数是 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);
}
如果将单独的 EXPECT 语句组合成一个完整的 EXPECT 语句,问题就解决了。
MOCK_EXPECT(objMockAClass.getTest).at_least(1).returns(1);
- 这将使示例按计划工作。
此致,
MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);
这其实是两种期待。第一个表示 'everytime getTest gets called return 1',第二个表示 'getTest must be called at least one time'。 问题是第一个总是匹配,因此第二个不会有机会被触发。