我有一个场景,其中调用SendFeedback()
发送消息并成功返回。该消息由另一个抛出的线程接收。CCD_ 2不工作,因为CCD_ 3不抛出自己。有没有办法期待这种例外?
伪代码:
auto listener = Listener();
auto sender = Sender();
...
sender.SendFeedback();
// listener throws due to unexpected feedback. This exception is to be expected
这并不是您所要求的,但GTest具有用于死亡测试的机制,在该机制中,您可以断言给定的调用会使程序崩溃。未捕获的异常调用std::terminate
,默认情况下调用std::abort
,从而传递断言。
我做了一些小的概念验证来验证它的工作原理:
void delayed_uncaught_exception()
{
using namespace std::chrono_literals;
std::thread thread([] { throw std::runtime_error("Error"); });
std::this_thread::sleep_for(50ms);
}
TEST(MyDeathTest, DelayedException)
{
ASSERT_DEATH(delayed_uncaught_exception(), "");
}
尽管,我强烈同意这个问题下的讨论,死亡测试可能不是最适合这种测试场景的,从长远来看,我建议重新设计流程。
我为通信库编写了类似的测试程序。我使用了一个独立的通信通道将结果发送回gtest线程。接收器线程必须捕获异常并将结果发送回进程的gtest线程。这个通信通道可以只是一个全局变量或某种消息队列,但这两个线程必须同步。我发现障碍对此很有用。