0Pricing
C++ Academy · レッスン

GMockによるモック

依存関係をモック化します

「GMockによるモック」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

モックを使う理由

GMockは、呼び出しを記録し、あらかじめ設定した結果を返す偽オブジェクトを作成します。モックを使うと、データベースやネットワークのような低速または予測しにくい依存関係からテスト対象の単体を分離できます。

インターフェースから始める

モック化可能な依存関係は、通常、仮想メソッドを持つ抽象基底クラスとして定義します。

#include <string>

class Database {
public:
    virtual ~Database() = default;
    virtual std::string get(int id) = 0;
    virtual bool save(const std::string& v) = 0;
};

モッククラスを定義する

MOCK_METHODを使うと、各仮想メソッドのモックを生成できます。戻り値の型、名前、引数、修飾子を指定します。

#include <gmock/gmock.h>
#include <string>

class Database {
public:
    virtual ~Database() = default;
    virtual std::string get(int id) = 0;
};

class MockDatabase : public Database {
public:
    MOCK_METHOD(std::string, get, (int id), (override));
};

期待値を設定する

EXPECT_CALLは、モックメソッドをどのように呼び出すべきか、また何を返すべきかを指定します。WillOnce(Return(...))で結果を設定します。

#include <gmock/gmock.h>
using ::testing::Return;

TEST(DbTest, ReturnsValue) {
    MockDatabase db;
    EXPECT_CALL(db, get(1)).WillOnce(Return("alice"));
    EXPECT_EQ(db.get(1), "alice");
}

引数マッチャー

期待値では、_(任意の値)、Gt(5)、HasSubstr("x") などのマッチャーを使って、引数を柔軟に照合できます。

#include <gmock/gmock.h>
using ::testing::_;
using ::testing::Return;

TEST(DbTest, AnyId) {
    MockDatabase db;
    EXPECT_CALL(db, get(_)).WillRepeatedly(Return("x"));
    EXPECT_EQ(db.get(99), "x");
}

呼び出し回数

Times を使って、呼び出しが何回行われることを期待するかを指定します。

  • Times(1) ちょうど1回
  • Times(AtLeast(2))
  • Times(0) 呼び出されてはいけない
#include <gmock/gmock.h>
using ::testing::AtLeast;
using ::testing::Return;

TEST(DbTest, CalledTwice) {
    MockDatabase db;
    EXPECT_CALL(db, get(1)).Times(AtLeast(2)).WillRepeatedly(Return("v"));
    db.get(1);
    db.get(1);
}

戻り値アクション

アクションによって動作を決めます。

  • Return(value)
  • ReturnRef(ref)
  • Throw(exception)
  • カスタムコードを実行する Invoke(callable)

モックの注入

テスト対象のユニットは、インターフェースへのポインターまたは参照を通じて依存関係を受け取れる必要があります。これが依存性注入であり、モックを利用可能にする仕組みです。

#include <string>

class Database;

class UserService {
    Database& db;
public:
    UserService(Database& d) : db(d) {}
    std::string name(int id);
};

インタラクションの検証

GMock はモックが破棄されるときに、すべての EXPECT_CALL の期待値を検証します。満たされなかった期待値(回数が違う、または呼び出しがない場合)があると、テストは自動的に失敗します。

Nice・Strict・Naggy モック

予期しない呼び出しをどのように扱うかを制御します。

  • NiceMock:関心のない呼び出しを無視します
  • StrictMock:予期しない呼び出しがあると失敗します
  • デフォルト(naggy):関心のない呼び出しに警告します

自分が所有するものだけをモックする

サードパーティーの具象クラスではなく、自分で定義したインターフェースをモックすることを優先してください。外部ライブラリの周囲に薄いラッパーインターフェースを導入すると、テストを安定させられます。

クイックチェック

GMock が期待値を確認するタイミングを思い出してください。

まとめ

GMock について学びました。

  • MOCK_METHOD で仮想インターフェースをモックします
  • EXPECT_CALL とアクションで動作を定義します
  • マッチャーと Times で引数と呼び出し回数を制御します
  • モックを注入し、破棄時に期待値を検証します

よくある質問

「GMockによるモック」レッスンは無料ですか?

はい。「GMockによるモック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「GMockによるモック」で何を学びますか?

依存関係をモック化します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「GMockによるモック」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. GTestのセットアップ
  2. アサーションとマッチャー
  3. フィクスチャとセットアップ
  4. GMockによるモック
← C++ Academyに戻る