在 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测试功能。
我知道这很简洁,但我希望你能理解。
我想在我的程序中测试一个处理应用程序关闭的方法。最后这个方法调用 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测试功能。
我知道这很简洁,但我希望你能理解。