モック オブジェクトとデス テストを使用する googletest 単体テストの 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.
アサーションの直後にヒープに残っているモック オブジェクトを googlemock がチェックしているように見えますが、マクロを呼び出す前にEXPECT_DEATH
削除することは、呼び出された関数で使用される可能性があるためa
、明らかに良い解決策ではありません。a
実際には、テスト スイートの分解の最後にチェックが行われることを期待しています。私は何が欠けていますか?