您如何模拟在测试gmock下属于该类的函数?

时间:2019-02-28 13:23:52

标签: c++ unit-testing gmock

我正在使用googletest / googlemock。 当Selection自然返回false时,我只能测试以下代码。 我将如何模拟下面的示例问题?

我很难更改选择的返回值,因为它使用真实代码。

class frame
{
    bool Selection();
    void Actions();
};

void frame::Action()
{
    if (Selection())
    {
        // do something
    }
    else
    {
        // do something else
    }
}

void WrapAction()
{
    Frame->Action();
}

TEST_F(UITest, ActionWithSelectionTrue)
{
    EXPECT_CALL(*Frame, Selection()).WillOnce(Return(true));

    WrapAction();
}

TEST_F(UITest, ActionWithSelectionFalse)
{
    EXPECT_CALL(*Frame, Selection()).WillOnce(Return(false));
    WrapAction();
}

1 个答案:

答案 0 :(得分:1)

传统的单元测试具有 A 3 形式:

  1. 组装(也称为“排列”;设置要测试的对象)
  2. 动作(对对象执行所需的操作)
  3. 声明(验证更改的正确值,发出事件等)

这是用于测试的有效表格,完全不需要模拟框架。

在模拟测试中,您可能(取决于模拟库的工作方式)必须将此过程修改为 A 4

  1. 组装(包括注入模拟的依赖项)
  2. 期望(通过识别期望的调用,设置返回值,副作用等来设置对模拟依赖项的期望)
  3. 行为
  4. 声明(如果模拟期望涵盖了所有内容,则可能没有其他要断言的地方。)

就您而言,尚不清楚您在嘲笑什么。您要用模拟代替的dependencies you are injecting在哪里?

鉴于您向我们展示的代码,我认为您应该使用 A 3 测试模式。这意味着在“组装”部分中,您可以通过设置选择来配置对象,然后对它执行操作并检查结果。

如果您无法使用 A 3 模式,则可能意味着您需要重构以更好地分离依赖项。完成此操作后,即可使用 A 4 模式进行模拟和测试。