Используя метод friend, объявление будет зависеть от имени тестового класса, поэтому, если вы когда-нибудь измените его имя, объявление также должно быть изменено. Более того, я использую Unittest ++, поэтому реальное имя тестового набора формируется макросом.
Метод с определением меньше хлопот тогда. Кроме того, я бы просто поместил определение как глобальную опцию компилятора вместо того, как вы показываете, например
gcc -DUNIT_TESTING_ON
#ifdef UNIT_TESTING_ON
public: //or protected maybe
#else
private:
#endif
Любой, кто читает это, также увидит, какова цель, это более понятно, чем поиск определения друга, чтобы понять, почему именно вы сделали его другом.