我正在使用 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。如果其中至少有一个是,它应该触发断言。但是测试失败了,因为 failure 是'never called'。调试显示它被调用。
然后我尝试对 Times 部分进行评论,只是为了确保它来自这里并且这是唯一的问题。它有效,但还不够:我想确保程序死于我的断言。由于 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),但我得到的模式与最初相同:“退出”调用似乎阻止了所有 EXPECT_CALL 评估。
任何提示/解决方法? :)
编辑:忘了告诉:执行环境。是带有 Visual Studio 2008 的 Windows 7。
最佳答案
Google Test's wiki解释这个:
Since statement runs in the child process, any in-memory side effect (e.g. modifying a variable, releasing memory, etc) it causes will not be observable in the parent process.
这包括 Google Mock 对死亡测试声明中调用的跟踪。简而言之,Google Mock 和死亡测试不能混用。
我的建议是将这些测试分开。使用 Google Mock 来验证故障处理程序是否被调用,并使用死亡测试来验证您的故障处理程序是否确实执行了它应该做的事情(终止程序、打印指定的输出等)
关于c++ - 死亡测试时错误的函数调用评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974251/