GMock으로 모킹하기
의존성 모킹하기
GMock으로 모킹하기은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 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)정확히 한 번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 기대 조건을 검증합니다. 충족되지 않은 기대 조건(호출 횟수가 잘못되었거나 호출이 누락된 경우)은 테스트를 자동으로 실패하게 합니다.
일반 모의 객체, 엄격한 모의 객체, 경고 모의 객체
예상하지 못한 호출을 처리하는 방식을 제어합니다.
NiceMock: 중요하지 않은 호출을 무시합니다StrictMock: 예상하지 못한 호출이 발생하면 실패합니다- 기본값(경고 모드): 중요하지 않은 호출에 경고합니다
자신이 소유한 것만 모의 객체로 만들기
타사 구체 클래스가 아니라 자신이 만든 인터페이스를 모의 객체로 만드는 것이 좋습니다. 외부 라이브러리 주위에 얇은 래퍼 인터페이스를 도입하면 테스트를 안정적으로 유지할 수 있습니다.
빠른 확인
GMock이 언제 기대 조건을 확인하는지 떠올려 보세요.
복습
GMock을 배웠습니다.
MOCK_METHOD로 가상 인터페이스를 모의 객체로 만듭니다EXPECT_CALL과 동작으로 동작 방식을 프로그래밍합니다- 매처와
Times로 인수와 호출 횟수를 제어합니다 - 모의 객체를 주입하고, 소멸 시 기대 조건을 검증합니다
자주 묻는 질문
“GMock으로 모킹하기” 강의는 무료인가요?
네 — “GMock으로 모킹하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“GMock으로 모킹하기”에서 뭘 배우나요?
의존성 모킹하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“GMock으로 모킹하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- GTest 설정하기
- 검증과 매처
- 픽스처와 설정
- GMock으로 모킹하기