Для модульного тестирования в C я хотел бы создать два объектных файла (A и B) в производственных источниках, которые вызывают функции друг в друге. Затем для модульного тестирования предоставьте ложные / фиктивные реализации A и B, которые можно включать и выключать во время выполнения для модульного тестирования.
Что я хочу сделать, это связать вместе A, B, fake_A и fake_B в один большой тестовый двоичный файл, который может переключаться между производственной и поддельной реализацией модуля во время выполнения для модульного тестирования обоих.
Это потому, что было бы неплохо избегать создания нескольких различных двоичных файлов теста для каждого случая и необходимости консолидировать результаты.
Я буду компилировать A и B специально для модульного теста, поэтому могу принудительно использовать дополнительные заголовки, определения, флаги компилятора и т. Д., Которые не будут присутствовать во время выполнения.
Мне интересно, можно ли разорвать связь между функциями в A и B с помощью какого-либо переписывания или трюков во время компоновки.
Позвольте мне попытаться проиллюстрировать. Допустим, у меня есть файлы a.c, b.c, fake_a.c и fake_b.c:
a.c
void a_work(void) {
b_work();
}
b.c
void b_work(void) {
do_some_work();
}
fake_b.c
/* for test, when a_work() calls b_work() I want this to be run */
void b_work(void) {
if (fake_b_enabled)
do_fake_b_work();
else
// call the real b_work() somehow
}
Обычно вызов a_work () для b_work () связан с реальным b_work () во время соединения, это то, что я хочу перехватить или переписать.
Я думаю о какой-то оболочке со слоем указателя на функцию, но я не знаю, как это сделать.