我有一個使用模擬對象和死亡測試的googletest單元測試問題。這是說明了這個問題最小化的代碼示例:死亡測試中奇怪的堆檢查器錯誤
#include <gtest/gtest.h>
#include <gmock/gmock.h>
using namespace ::testing;
class MockA {
public:
MockA() {};
virtual ~MockA() {};
MOCK_METHOD1(bla,int(int));
};
class B {
public:
B(MockA * a)
: a_(a) {};
void kill() {
exit(1);
}
MockA * a_;
};
TEST(BDeathTest,BDies) {
MockA * a = new MockA();
ON_CALL(*a,bla(_)).WillByDefault(Return(1));
B * b = new B(a);
EXPECT_DEATH(b->kill(),"");
delete a;
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
輸出:
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from BDeathTest
[ RUN ] BDeathTest.BDies
gtest.cc:27: ERROR: this mock object (used in test BDeathTest.BDies) should be deleted but never is. Its address is @0x7fe453c00ec0.
ERROR: 1 leaked mock object found at program exit.
[ OK ] BDeathTest.BDies (2 ms)
[----------] 1 test from BDeathTest (2 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (2 ms total)
[ PASSED ] 1 test.
好像googlemock檢查遺留堆上mock對象的EXPECT_DEATH
斷言之後,但刪除a
在調用宏之前顯然不是一個好的解決方案,因爲a
可能在被調用的函數中使用。我實際上希望檢查發生在測試套件解構的結尾。我錯過了什麼?
可能是子進程中的退出導致程序終止而不刪除模擬對象,但會導致模擬對象清理例程進行泄漏檢查。我會嘗試使用abort()而不是退出 – PlasmaHH 2012-03-02 20:56:19
它實際上使用'abort()'工作,雖然這沒有多大幫助,因爲我想檢查生產代碼中的特定錯誤代碼。 – jupp0r 2012-03-02 21:23:04
我不認爲死亡測試是爲了這個,他們應該只是保證有東西崩潰。也許你想拋出異常並驗證某個異常是否被拋出? – PlasmaHH 2012-03-02 21:30:36