EXPECT_CALL 返回“实际:从未调用过 - 不满意且处于活动状态”

问题描述 投票:0回答:2

我有以下场景,我调用

EXPECT_CALL
将函数
Foo
的返回值设置为
true
但是我收到以下错误

Actual: never called - unsatisfied and active

我看到的一件重要的事情是将一个对象传递给

EXPECT_CALL
,这里就是这种情况。如
classPtr
中所示,是指向
MockClass
对象的有效指针。

// 被测类

class Feature
{
    [[maybe_unused]] virtual bool Foo(const std::string& digit, int number);
};

//模拟课

class MockClass : public Feature
{
  public:
  MOCK_METHOD(bool, Foo, (const std::string& digit, int number),
              (override));
};

//测试类

class UtClass : public Ut
{
   public:
   std::unique_ptr<MockClass> classPtr = std::make_unique<MockClass>());
}

TEST_F(UtClass, Test)
{
    EXPECT_CALL(*classPtr, Foo("A", 5))
    .WillOnce(Return(true));   // Actual: never called - unsatisfied and active
}
c++ googletest googlemock
2个回答
1
投票
  1. 您不打电话给
    Foo
    。 “从未调用过”是一个预期错误。
  2. 您应该创建和销毁
    MockClass
    ,在测试用例中使用本地
    MockClass mock_class
    TEST_F(UtClass, Test)
    ,否则您将收到有关模拟对象泄漏的错误。

应该是这样的

class Feature {
  [[maybe_unused]] virtual bool Foo(const std::string& digit, int number);
};

class Consumer {
 public:
  bool Eat(Feature *f) {
    return f->Foo("A", 5);
  }
};

class MockClass : public Feature {
 public:
  MOCK_METHOD(bool, Foo, (const std::string& digit, int number), (override));
};

class UtClass : public ::testing::Test {
};

TEST_F(UtClass, Test) {
  MockClass mock;
  EXPECT_CALL(mock, Foo("A", 5)).WillOnce(Return(true));

  Consumer consumer;
  consumer.Eat(&mock);
}

0
投票

开始使用 Google Mock 时,我最初不清楚的是

EXPECT_CALL()
作为需要在测试代码运行之前设置的配置。

Google Test 中的典型工作流程遵循以下步骤:

  • 使用预定的输入调用被测代码。
  • 断言某些输出(例如,使用 ASSERT_EQ)。

但是,Google Mock 工作流程有所不同:

  • 设置你的模拟。
  • 配置预期的模拟行为(使用
    EXPECT_CALL()
    )。
  • 执行被测代码;这段代码应该调用你的模拟。
  • 虽然您仍然可以在此阶段断言一些输出值,但请记住,必须在执行测试代码之前配置
    EXPECT_CALL()

尝试执行代码然后调用

EXPECT_CALL()
会导致
Actual: never called - unsatisfied and active
警告。

这个误解对我来说至关重要。

© www.soinside.com 2019 - 2024. All rights reserved.