在这种情况下,我会避免重定向或测试 stdout 或 stderr 中的值,因为对这些流的访问不是线程安全的,因为输出缓冲区可能不会像可能预测的那样被附加和刷新。
从测试的角度来看,我建议将方法重构为无状态并将状态(又名 std::cout)保留在其他地方。在您的示例中,您开始测试外部 API 的行为,而不是对象中的实际修改。
class MyClass {
std::sstream state;
public:
void print(){ std::cout << state.str(); } // no need to test this method, only external API
void changeState() {
state << "Hello" << std::endl; // this should be tested
}
}
在您的测试代码中,您现在可以使用
// Tests if sayHello() outputs Hello
TEST(MyClassTest, sayHello)
{
myClass.changeState();
EXPECT_STREQ(myClass.state.str().c_str(),"Hello");
}