Turtle Mock:如果mocked类方法返回一个值,则MOCK_EXPECT失败

时间:2016-10-06 07:33:21

标签: c++ unit-testing boost turtle-mock

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

我正在为Linux编写一个C ++ Boost应用程序(Virtualized Ubuntu 16.04 amd_64),我正在使用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);

}

2 个答案:

答案 0 :(得分:0)

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

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

此致

答案 1 :(得分:0)

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

这实际上是两个期望。第一个意味着每次getTest被称为返回1'并且第二次“getTest”必须至少调用一次'。 问题是第一个将始终匹配,因此第二个将没有机会被触发。