Мы делаем именно то, что вы имеете в виду.
Сначала мы создали несколько макросов:
#define CAPTURE_STDOUT StdoutRedirect::instance().redirect();
#define RELEASE_STDOUT StdoutRedirect::instance().reset();
#define ASSERT_INFO( COUNT, TARGET ) \
ASSERT_PRED_FORMAT2(OurTestPredicates::AssertInfoMsgOutput, TARGET, COUNT );
Смотрите этот ответ для захвата stdout и stderr:
https://stackoverflow.com/a/5419409/9796918
Просто используйте их BeginCapture (), EndCapture () вместо нашего redirect () и reset ().
В методе AssertInfoMsgOutput:
AssertionResult OurTestPredicates::AssertInfoMsgOutput( const char* TARGET,
const char* d1,
const char* d2,
int COUNT )
{
int count = 0;
bool match = false;
std::string StdOutMessagge = GetCapture();
// Here is where you process the stdout/stderr info for the TARGET, and for
// COUNT instances of that TARGET message, and set count and match
// appropriately
...
if (( count == COUNT ) && match )
{
return ::testing::AssertionSuccess();
}
return :: testing::AssertionFailure() << "not found";
}
Теперь в вашем модульном тесте просто оберните ваши вызовы, которые вы хотите захватить stdout / stderr, с помощью:
CAPTURE_STDOUT
// Make your call to your code to test / capture here
ASSERT_INFO( 1, "Foo bar" );
RELEASE_STDOUT