하드웨어 접근을 인터페이스로 가르는 설계가 전제다.
/* 인터페이스 */
typedef struct {
uint16_t (*adc_read)(uint8_t ch);
void (*gpio_set)(uint8_t pin, bool on);
} Hal;
/* 타깃 */ Hal real = { hw_adc_read, hw_gpio_set };
/* 테스트 */ Hal fake = { fake_adc_read, record_gpio_set };
무엇이 좋아지나
경계 조건을 마음대로 만든다 "센서가 최대값을 낸다면" 을 즉시 시험
호출을 기록해 검증한다 "경고 핀이 정확히 한 번 켜졌는가"
시간을 조작한다 1시간 뒤 동작을 1초 만에 시험
시간을 가짜로 만드는 것이 특히 강력하다 — 타임아웃·주기 로직을 실제로 기다리지 않고 검증한다.
과하면 손해다
모든 것을 모킹하면 테스트가 구현을 그대로 베낀 형태가 되어, 리팩터링할 때마다 깨진다. 경계(하드웨어 접근)만 가르고 로직은 진짜를 쓰는 것이 균형점이다.
임베디드에서의 한계
타이밍·전기적 동작은 모킹으로 검증되지 않는다. 그 층은 HIL 이 맡는다.