Я знаю, что это спорная практика, но давайте предположим, что это лучший вариант для меня. Мне интересно, какова реальная техника, чтобы сделать это. Подход, который я вижу, заключается в следующем:
1) Сделайте класс друга из класса, метод которого я хочу проверить.
2) В другом классе создайте открытый (ые) метод (ы), который вызывает закрытый (ые) метод (ы) тестируемого класса.
3) Проверьте общедоступные методы класса друга.
Вот простой пример, иллюстрирующий вышеуказанные шаги:
#include <iostream>
class MyClass
{
friend class MyFriend; // Step 1
private:
int plus_two(int a)
{
return a + 2;
}
};
class MyFriend
{
public:
MyFriend(MyClass *mc_ptr_1)
{
MyClass *mc_ptr = mc_ptr_1;
}
int plus_two(int a) // Step 2
{
return mc_ptr->plus_two(a);
}
private:
MyClass *mc_ptr;
};
int main()
{
MyClass mc;
MyFriend mf(&mc);
if (mf.plus_two(3) == 5) // Step 3
{
std::cout << "Passed" << std::endl;
}
else
{
std::cout << "Failed " << std::endl;
}
return 0;
}
Редактировать:
Я вижу, что в обсуждении после одного из ответов люди задаются вопросом о моей кодовой базе.
В моем классе есть методы, которые вызываются другими методами; ни один из этих методов не должен вызываться вне класса, поэтому они должны быть закрытыми. Конечно, их можно объединить в один метод, но по логике они гораздо лучше разделены. Эти методы достаточно сложны, чтобы гарантировать модульное тестирование, и из-за проблем с производительностью мне, скорее всего, придется пересмотреть эти методы, поэтому было бы неплохо провести тест, чтобы убедиться, что мой рефакторинг ничего не сломал. Я не единственный, кто работает в команде, хотя я единственный, кто работает над этим проектом, включая тесты.
Сказав выше, мой вопрос не был о том, является ли хорошей практикой написание модульных тестов для частных методов, хотя я ценю обратную связь.