2014-01-08 70 views
0

代碼片段的相關部分。上面的代碼片段導致在退出時在Win VC 8編譯器中生成以下錯誤。在斷言器中傳遞斷言可以修復崩潰。這個錯誤只在窗口中觀察到,並且在linux中可以正常工作。斷言失敗時CPPUNIT_ASSERT_MESSAGE在析構函數中崩潰

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

TestFixture的構造函數和析構函數不受異常保護。如果您想在此階段使用斷言,您需要更改代碼,以便將使用斷言(拋出異常)的代碼移動到setUp/tearDown中。

事實上,它甚至可能不會以未處理的異常終止,而是會崩潰,因爲在展開堆棧時可能會得到第二個異常。爲了分離不同測試的狀態,測試夾具被包裝成一個函子,並且每個測試都會得到一個存儲在向量中的新實例。這又一次表明,在析構函數中拋出異常幾乎總是一個壞主意。