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

标签 c++ unit-testing googletest googlemock

我正在使用 googletest/googlemock (GTest/GMock)。 我只能在 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();
}

最佳答案

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

  1. 组装(也称为“排列”;设置被测对象)
  2. Act(对对象执行所需的操作)
  3. 断言(验证正确的值已更改、事件已发出等)

这是一种有效的测试形式,根本不需要模拟框架。

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

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

在您的情况下,不清楚您在 mock 什么。 dependencies you are injecting在哪里你要用 mocks 代替吗?

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

如果您不能在 A3 模式下工作,这可能意味着您需要重构以更好地分离您的依赖项。当您这样做时,您可以使用 A4 模式进行模拟和测试。

关于c++ - 您如何在测试 gmock 下模拟属于该类的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54926796/

相关文章:

c++ - 使用 Visual C++ 2010 编译器在 code::block 中使用 widgets 库时,发生错误

c++ - 如何使用 boost 异常将信息添加到 std::exception

javascript - 如何避免 $digest 在测试过程中已经在进行中

c++ - Iceberg 类和 Google 单元测试

c++ - 在windows中使用gcc+gtest+mockcpp,mock根本不起作用

c++ - ptrdiff_t typedef 冲突 - google-test 和 intel anaconda

c++ - lex_cast : Make formatted streams, 未格式化

c++ - 如何在opencv中交换Mat的行?

c# - 模拟CloudStorageAccount和CloudTable for Azure表存储

c# - 如何对使用 Entity Framework 的存储库模式进行单元测试?