การจำลองด้วย GMock
จำลองสิ่งที่ต้องพึ่งพา
การจำลองด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่า GTest
- การยืนยันและตัวจับคู่
- ฟิกซ์เจอร์และการตั้งค่า
- การจำลองด้วย GMock