簡體   English   中英

如何模擬Boost引發異常?

[英]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
}

我使用gmockgtest編寫單元測試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 ,即使這是解決問題的正確方法。

您的測試方法非常好。 關鍵是無法模擬免費功能,而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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM