您如何模拟一个正在测试GMOCK的函数

How do you mock a function that is part of that class under test gmock?

本文关键字:测试 GMOCK 函数 一个 何模拟 模拟      更新时间:2023-10-16

我正在使用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();
}

传统单元测试的 a 3 表格:

  1. 组装(也称为"安排";在测试中设置对象)
  2. ACT (对象对所需的操作执行所需的动作)
  3. sustert (验证正确的值更改,事件已发出等)

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

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

  1. 召集(包括注入模拟的依赖项)
  2. 预期(通过识别预期的呼叫,设置返回值,副作用等来设置模拟依赖关系的期望)
  3. ACT
  4. 断言(如果模拟期望涵盖一切,可能没有别的断言)。

就您而言,尚不清楚您在嘲笑什么。您要注射的依赖项在哪里取代模拟?

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

如果您无法在 a 3 模式中工作,这可能意味着您需要重构以更好地分开依赖关系。当您这样做时,您可以使用 a 4 模式进行模拟和测试。