C++ Academy · บทเรียน

การจำลองด้วย GMock

จำลองสิ่งที่ต้องพึ่งพา

บทเรียน 4 จาก 413 ขั้นตอน

การจำลองด้วย GMock เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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) หนึ่งครั้งพอดี
  • 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);
};

การตรวจสอบปฏิสัมพันธ์

จีม็อกจะตรวจสอบความคาดหวังของ EXPECT_CALL ทั้งหมดเมื่อม็อกถูกทำลาย ความคาดหวังที่ไม่เป็นไปตามเงื่อนไข (จำนวนครั้งไม่ถูกต้องหรือไม่มีการเรียก) จะทำให้การทดสอบล้มเหลวโดยอัตโนมัติ

ม็อกแบบ Nice, Strict และ Naggy

ควบคุมวิธีจัดการกับการเรียกที่ไม่คาดคิด

  • NiceMock: ไม่สนใจการเรียกที่ไม่สำคัญ
  • StrictMock: การเรียกที่ไม่คาดคิดใด ๆ จะทำให้ล้มเหลว
  • ค่าเริ่มต้น (แบบ Naggy): แจ้งเตือนเมื่อมีการเรียกที่ไม่สำคัญ

สร้างม็อกเฉพาะสิ่งที่คุณเป็นเจ้าของ

ควรสร้างม็อกให้กับส่วนติดต่อของคุณเอง ไม่ใช่คลาสรูปธรรมจากบุคคลที่สาม ควรสร้างส่วนติดต่อแบบห่อหุ้มที่บางรอบไลบรารีภายนอก เพื่อให้การทดสอบยังคงเสถียร

ตรวจสอบอย่างรวดเร็ว

ทบทวนว่าจีม็อกตรวจสอบความคาดหวังเมื่อใด

สรุปทบทวน

คุณได้เรียนรู้จีม็อก

  • สร้างม็อกให้กับส่วนติดต่อเสมือนด้วย MOCK_METHOD
  • EXPECT_CALL + การดำเนินการ ใช้กำหนดพฤติกรรม
  • ตัวจับคู่และ Times ใช้ควบคุมข้อโต้แย้งและจำนวนครั้ง
  • ฉีดม็อกเข้าไป และตรวจสอบความคาดหวังเมื่อมีการทำลาย
เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “การจำลองด้วย GMock” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจำลองด้วย GMock” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจำลองด้วย GMock”

จำลองสิ่งที่ต้องพึ่งพา คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจำลองด้วย GMock” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า GTest
  2. การยืนยันและตัวจับคู่
  3. ฟิกซ์เจอร์และการตั้งค่า
  4. การจำลองด้วย GMock
← กลับไปที่ C++ Academy