1. ホーム
  2. c++

[解決済み] 面白くないモック関数呼び出し bla() && 期待すること: 少なくとも一度は呼び出される bla()?

2022-02-19 13:10:02

質問

モック化されたクラスで小さなテストを書きました。それを実行すると、まず、興味のないモック関数が呼ばれたという警告が表示され、次に、モック関数が少なくとも一度は呼ばれるという期待値が満たされないためにテストが失敗します。面白いのは、上記の警告メッセージが表示されたときに、その関数が呼び出されることです。

この件に関して、何かお心当たりはありませんか?

ありがとうございました。

編集:これは私のコード構造です。

class Bla {

public:
    Bla();
    virtual ~Bla();

    virtual float myFunction();
}

class MockBla : public Bla {
    MockBla();
    ~MockBla();
    MOCKMETHOD0(myFunction, float());
}

class CallerClass {

public:
    CallerClass() { MockBla* myMock = new MockBla(); }
    virtual ~CallerClass();

    myCallingFunction() { myMock->myFunction(); }
}

class MyTestClass : public ::testing::Test {
//....
    TEST(myTest, testMyFunction) {
    MockBla mockBla;
    EXPECT_CALL(mockBla, myFunction()).Times(AtLeast(1));

    CallerClass* callerClass;
    callerClass = new CallerClass();

    callerClass->myCallingFunction();

    }
//....
}

結果

[ RUN      ] MyTestClass.testMyFunction

GMOCK WARNING:
Uninteresting mock function call - returning default value.
    Function call: myFunction()
          Returns: 0
Stack trace:
MyTestClass.cpp:99: Failure
Actual function call count doesn't match EXPECT_CALL(mockBla, myFunction())...
         Expected: to be called at least once
           Actual: never called - unsatisfied and active

解決方法は?

テストの実行中に呼び出されるモッククラスの実際のインスタンスに期待値を設定する必要があります。

あなたの場合、期待値を設定するオブジェクトは mockBla これはテストの最後に構築され、破棄されるだけで、決して使用されることはありません。

モックオブジェクトを CallerClass を使用するようにするか、あるいは CallerClass を作成してモックオブジェクトをメンバ変数として作成し、 テスト側でそのメンバにアクセスできるようにします (たとえばゲッターを使ったり、テスト側を CallerClass ).

モック化したオブジェクトを呼び出し側のクラスに渡す例としては、次のようなものがあります。

#include <memory>
#include "gmock/gmock.h"

class Bla {
 public:
  virtual ~Bla() {}
  virtual float myFunction() = 0;
};

class MockBla : public Bla {
 public:
  MOCK_METHOD0(myFunction, float());
};

class CallerClass {
 public:
  explicit CallerClass(Bla* bla) : mBla(bla) {}
  void myCallingFunction() { mBla->myFunction(); }
 private:
  Bla* mBla;
};

TEST(myTest, testMyFunction) {
  std::shared_ptr<Bla> mockBla(new MockBla);
  EXPECT_CALL(*std::static_pointer_cast<MockBla>(mockBla),
              myFunction()).Times(testing::AtLeast(1));

  CallerClass callerClass(mockBla.get());
  callerClass.myCallingFunction();
}

int main(int argc, char** argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}