在 Boost.Test 中抑制退出信号

Suppress exit signal in Boost.Test

我想在我的程序中测试一个处理应用程序关闭的方法。最后这个方法调用 exit(0);

正如预期的那样,这也关闭了我的测试应用程序。

是否有可能在这个特定的单元测试中捕获退出信号,从而避免测试应用程序的关闭?

由于无法阻止 exit() 结束程序,您将不得不以某种方式更改遗留应用程序。

对于类似的问题,我使用了以下解决方案:

  • 一个 class 通过 public 静态函数提供我想要 use/change 的功能,例如
    static void Wrapper::exit( int exit_code);
  • 一个基础class,它声明了我要提供的功能的接口:
    virtual void Base::exit( int exit_code) = 0;
  • 然后是 class,派生自基础 class Base,它实现了正常行为:
    void OsImpl::exit( int exit_code) { ::exit( exit_code); }
  • Wrapper class 最终包含指向要使用的实现的指针,默认情况下是 OsImpl 的对象,但可以替换为例如什么都不做的TestImpl
    static void Wrapper::setImpl( Base* handler);
  • 最后,在应用程序中将::exit( 0);替换为Wrapper::exit( 0);
    时,当运行"normally"时,应用程序将像以前一样停止,但在您的测试中程序你可以return测试功能。

我知道这很简洁,但我希望你能理解。