モックオブジェクトと死のテストを使用して私のgoogletest unittestsの1つに問題があります。これは、問題を示して最小限のコードサンプルです:死のテストで奇妙なヒープチェッカーのエラー
#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.
それは右EXPECT_DEATH
表明した後、ヒープ上のモックオブジェクトの上に左用googlemockチェックのように思えるが、a
を削除呼び出される関数でa
が使用される可能性があるため、マクロを呼び出す前には明らかに良い解決策ではありません。実際には、テストスイートの解体の終わりにチェックが行われると思います。私は何が欠けていますか?
おそらく、子プロセスの終了によって、プログラムはmockオブジェクトを削除せずに終了することになりますが、mockオブジェクトのクリーンアップルーチンはリークチェックを行います。私はabort()を出口の代わりに使用しようとしています – PlasmaHH
実際には 'abort()'を使って動作しますが、これはあまり役に立ちませんが、プロダクションコードの特定のエラーコードをチェックしたいのです。 – jupp0r
私は死のテストがそれのために作られたとは思わない、彼らはちょうど何かがクラッシュすることを保証する必要があります。たぶん、例外をスローして、特定の例外がスローされたことを確認したいでしょうか? – PlasmaHH