代码段的相关部分。上面的代码片段导致在退出期间在Win VC 8编译器中生成以下错误。在析构函数中传递断言可以修复崩溃。仅在Windows中观察到此错误,并且在linux中它可以正常工作。
class BasicMathTest: public TestFixture
{
CPPUNIT_TEST_SUITE(BasicMathTest);
CPPUNIT_TEST(testAdd);
CPPUNIT_TEST(testMultiply);
CPPUNIT_TEST(testDivide);
CPPUNIT_TEST_SUITE_END();
class A
{
public:
~A()
{
CPPUNIT_ASSERT_MESSAGE( "BasicMath::Addition", 0 );
}
};
A ob;
public:
virtual void setUp( void );
virtual void tearDown( void );
void testAdd( void );
void testMultiply( void );
void testDivide( void );
private:
BasicMath *obj;
};
int main()
{
TestRunner testrunner;
Test *tests = TestFactoryRegistry::getRegistry().makeTest();
testrunner.addTest( tests );
testrunner.run( m_testResult );
m_outputter->write();
return !m_collector.wasSuccessful();
}
答案 0 :(得分:0)
TestFixture的构造函数和析构函数不受异常保护。如果要在此阶段使用断言,则需要更改代码,以便可以将使用断言的代码(抛出异常)移动到setUp / tearDown中。
实际上,它甚至可能不会以未处理的异常终止而是崩溃,因为在展开堆栈时可能会遇到第二个异常。为了分离不同测试的状态,测试夹具被包装到仿函数中,每个测试都获得一个存储在向量中的新实例。再次提醒一下,在析构函数中抛出异常几乎总是一个坏主意。