在死亡测试中错误的函数调用评估

时间:2014-01-07 14:31:27

标签: c++ unit-testing googletest gmock

我正在使用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。如果至少有一个断言,它应该触发一个断言。但测试失败,因为失败是“永远不会被调用”。调试显示它被调用。

然后我试着评论 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),但我得到了与第一次相同的模式:'exit'调用似乎阻止了所有EXPECT_CALL评估。

任何提示/解决方法? :)

编辑:忘了告诉:执行环境是带有Visual Studio 2008的Windows 7。

1 个答案:

答案 0 :(得分:1)

Google Test's wiki解释了这一点:

  

由于语句在子进程中运行,因此任何内存中的副作用   (例如修改变量,释放内存等)它不会导致   在父进程中可以观察到。

这包括谷歌模拟跟踪死亡测试声明中的电话。简而言之,谷歌模拟和死亡测试不会混合。

我的建议是将这些测试分开。使用Google Mock验证是否调用了失败处理程序并使用死亡测试来验证您的失败处理程序是否确实执行了它应该执行的操作(终止程序,打印指定的输出等)。