0

我正在使用 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。

4

1 回答 1

2

Google Test 的 wiki解释了这一点:

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

这包括 Google Mock 跟踪死亡测试声明中的呼叫。简而言之,Google Mock 和死亡测试不能混用。

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

于 2014-01-08T08:19:54.170 回答