我长期潜伏在董事会中,不用说你们是最好的,并且我感谢您保存工作的所有时间。这是我第一次在这里发帖,希望我不要弄乱它。
我正在为Linux(虚拟化Ubuntu 16.04 amd_64)编写C ++ Boost应用程序,并使用Turtle Mock作为模拟框架,并使用Boost Test作为测试框架。当我尝试测试使用依赖注入技术的类时,我模拟了需要提供给测试类的类,以便可以验证其调用顺序。到目前为止还不错,但问题出在这里。
我正在使用MOCK_BASE_CLASS(MockAClass,AClass)覆盖真实AClass的虚拟方法,并使用新的MockAClass进行测试。假设在为MockAClass对象的getTest方法设置期望值和返回值并调用该方法之后,AClass具有一个虚拟方法int getTest(int),而MockAClass具有MOCK_METHOD(getTest,1,int(int))。在大多数情况下,永远不会验证MOCK_EXPECT(objMockAClass.getTest).at_least(1)。我可以控制返回值,但调用从未发生过验证。仅当函数返回值时才会发生这种情况(例如,如果函数为空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);
}
最佳答案
MOCK_EXPECT(objMockAClass.getTest).returns(1);
MOCK_EXPECT(objMockAClass.getTest).at_least(1);
这实际上是两个期望。第一个意思是“每次getTest被称为返回1”,第二个意思是“ getTest必须至少被调用一次”。
问题是第一个总是匹配的,因此第二个将没有机会被触发。