[英]How to mock boost throwing an exception?
我有使用boost
與文件系統進行交互的代碼,如下所示:
FileMigrater::migrate() const {
//stuff
try {
boost::filesystem::create_direcotry(some_path_);
} catch(const std::exception& e) {
LOG(ERROR) << "Bad stuff happened";
return MigrationResult::Failed;
}
//more stuff
}
我使用gmock
和gtest
編寫單元測試migrate
方法,我想編寫一個測試,其中的情況下boost
拋出異常。 理想情況下,我想編寫一個看起來像這樣的單元測試(因為我一般來說是新的c ++,所以它的語法是錯誤的):
TEST_F(MyTest, boost_exception_test) {
ON_CALL(boost_mock, create_directory()).Throw(std::exception);
EXPECT_EQ(Migration::Failed, migrater.migrate());
}
問題是我不知道如何創建boost_mock
,即使這是解決問題的正確方法。
您的測試方法非常好。 關鍵是googlemock無法模擬免費功能,而boost::filesystem::create_directory()
是其中之一。
但是, 文檔提出了一種解決方法:
可以使用Google Mock模擬自由函數(即C樣式函數或靜態方法)。 您只需要重寫代碼即可使用接口(抽象類)。
與其直接調用一個自由函數(例如,OpenFile),不如為其引入一個接口,並擁有一個具體的子類來調用自由函數:
class FileInterface { public: ... virtual bool Open(const char* path, const char* mode) = 0; }; class File : public FileInterface { public: ... virtual bool Open(const char* path, const char* mode) { return OpenFile(path, mode); } };
您的代碼應與FileInterface交談以打開文件。 現在很容易模擬出該函數。
這看起來很麻煩,但是在實踐中,您通常可以將多個相關功能放在同一個界面中,因此每個功能的語法開銷將大大降低。
如果您擔心虛擬函數引起的性能開銷,並且性能分析確認了您的擔憂,則可以將此與配方結合起來以模擬非虛擬方法 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.