【问题标题】:Turtle Mock: MOCK_EXPECT fails if mocked class method returns a valueTurtle Mock:如果模拟类方法返回值,则 MOCK_EXPECT 失败
【发布时间】:2016-10-06 07:33:21
【问题描述】:

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

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

}

【问题讨论】:

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


    【解决方案1】:
    MOCK_EXPECT(objMockAClass.getTest).returns(1);
    MOCK_EXPECT(objMockAClass.getTest).at_least(1);
    

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

    【讨论】:

    • 是的,这是正确的。它将它们作为两个独立的互斥语句处理,这就是它失败的原因。谢谢你的支持。 :)
    【解决方案2】:

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

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

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2022-11-07
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2013-10-15
      相关资源
      最近更新 更多