我正在使用 gtest 和 gmock 编写测试。我的大多数测试用例都应该因自定义断言(我模拟)而崩溃。麻烦来了:虽然断言很好地触发了,但我对预期的调用有很多问题。
以下代码是我为了使其工作而经历的三个步骤(因为是的,这部分工作):
class MyTestedObject : public testing::Test {
public:
static MockObject * myMockedObject;
};
void assertFailure() {
exit(1);
}
TEST_F(MyTestedObjectDeathTest, nullInputConstructors) {
MockAssertHandler assertHandler;
EXPECT_CALL(assertHandler, failure(_,_,_,_))
.Times(1)
.WillRepeatedly(InvokeWithoutArgs(assertFailure));
setHandler(assertHandler);
testing::Mock::AllowLeak(myMockedObject);
testing::Mock::AllowLeak(&assertHandler);
EXPECT_DEATH(new MyTestedObject(NULL, NULL,0), ".*");
}
MyTestedObject的构造函数开始检查参数是否为 NULL。如果其中至少有一个是,它应该触发一个断言。但是测试失败了,因为“从不调用失败”。调试显示它被调用。
然后我试图评论时代部分,以确保它来自这里并且这是唯一的问题。它有效,但还不够:我想确保程序从我的断言中消失。由于 EXPECT_CALL 的评估是在模拟对象被销毁时完成的,我猜出口调用搞砸了整个事情,所以我尝试了这个,它有效:
void testHelper() {
MockAssertHandler assertHandler;
EXPECT_CALL(assertHandler, failure(_,_,_,_))
.Times(1)
.WillRepeatedly(InvokeWithoutArgs(assertFailure));
setHandler(assertHandler);
testing::Mock::AllowLeak(MyTestedObjectTest::myMockObject);
testing::Mock::AllowLeak(&assertHandler);
new MyTestedObject(NULL, NULL,0);
}
TEST_F(MyTestedObjectDeathTest, nullInputConstructors) {
EXPECT_DEATH(testHelper(), ".*");
}
现在,我想确保没有调用其他函数。
我试图将myMockedObject放入StrictMock结构中并放入 EXPECT_CALL(...).Times(0),但我得到了与最初相同的模式:'exit' 调用似乎阻止了所有 EXPECT_CALL 评估。
任何提示/解决方法?:)
编辑:忘了告诉:执行环境。是带有 Visual Studio 2008 的 Windows 7。