我的主要問題是關于一個特定的 gmock 錯誤,但提供一些背景。我一直在從事一個更大的專案,在那里我有相同介面的不同實作。我希望能夠使用介面實體化一個類并選擇它必須使用的介面實作(在創建類實體時)。介面不共享,介面的每個實體僅由一個類實體使用。為了做到這一點,我使用了依賴注入并將介面實體存盤在一個 unique_ptr 中。這可以正常作業并為我提供所需的行為。為了對某些類進行單元測驗,我使用 gmock 來模擬介面,然后將模擬的介面注入到我的測驗類中。令我驚訝的是 gmock 告訴我我有一個我不明白的記憶體泄漏。一段簡化的代碼會產生相同的錯誤:
#include "gtest/gtest.h"
#include "gmock/gmock.h"
class Base {
public:
virtual int something() = 0;
};
class Mock : public Base {
public:
MOCK_METHOD(int, something, ());
};
class test : public ::testing::Test {
protected:
void SetUp() override {
mock = std::make_unique<Mock>();
EXPECT_CALL(*mock, something()).WillOnce(testing::Return(1));
}
std::unique_ptr<Mock> mock;
};
TEST_F(test, test) {
std::unique_ptr<Base> base = std::move(mock);
EXPECT_EQ(base->something(), 1);
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
測驗通過但產生警告:
錯誤:這個模擬物件(在測驗 test.test 中使用)應該被洗掉,但永遠不會被洗掉。它的地址是@0122CA60。
錯誤:在程式退出時發現 1 個泄漏的模擬物件。當物件被破壞時,驗證對模擬物件的期望。泄露一個 mock 意味著它的期望沒有得到驗證,這通常是一個測驗錯誤。如果你真的打算泄漏一個模擬,你可以使用 testing::Mock::AllowLeak(mock_object) 來抑制這個錯誤,或者你可以使用假或存根代替模擬。行程以退出代碼 1 結束
我的問題是 2 倍。1 為什么記憶體泄漏 2 我應該如何改進我的設計?請注意,示例中未顯示依賴項注入。將指標分配給介面將是一個建構式,它將指標移動到類中并從介面的實作中抽象出來。
uj5u.com熱心網友回復:
std::unique_ptr<Base> base = std::move(mock);是發生記憶體泄漏的地方:*base將被銷毀為 a Base,而不是 a Mock,當base被銷毀時。
最好的解決方法是添加一個虛擬解構式 ( virtual ~Base() = default;),對于具有任何其他虛擬成員的結構,您應該擁有它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397881.html
