通常這是通過創建全局對象來完成的,它們在構建時調用註冊方法。這在C++中通常被認爲是「良好實踐」(參見https://isocpp.org/wiki/faq/ctors#static-init-order),所以在嘗試這樣的實現之前,您應該非常精通這些問題。
無論如何,這是googletest使用方法 - 在TEST
預處理宏最終歸結爲(GTEST-internal.h):
// Helper macro for defining tests.
#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
public:\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
private:\
virtual void TestBody();\
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
};\
\
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
::test_info_ =\
::testing::internal::MakeAndRegisterTestInfo(\
#test_case_name, #test_name, NULL, NULL, \
(parent_id), \
parent_class::SetUpTestCase, \
parent_class::TearDownTestCase, \
new ::testing::internal::TestFactoryImpl<\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
所以,當你使用這個宏,的全局實例這個類調用了::testing::internal::MakeAndRegisterTestInfo
,其參數對應於測試用例。
感謝您的回覆。 那麼根據你的設計一個不使用靜態初始化就能達到相同結果的系統的好方法呢? 或者,沒有其他辦法嗎? –
如果你想在'main'被調用之前發生一些事情,你將不得不依靠靜態初始化。顯然Google選擇這樣實現它 - 我只是警告必須非常小心才能正確實現 - 因爲如C++ FAQ中所述,創建不穩定的實現將非常容易。 – MuertoExcobito
您的幫助非常感謝:) 非常感謝。 –