c++ - 使用模拟和死亡测试

标签 c++ unit-testing googletest googlemock

我发现了 Google Test 的一个意想不到的行为,当涉及到死亡测试与对模拟对象的期望相结合时。

检查以下示例:

#include <gmock/gmock.h>
#include <cassert>

class Interface
{
public:
    virtual void foo() = 0;
};

class InterfaceMock : public Interface
{
public:
    MOCK_METHOD0(foo, void());
};

class Bar
{
public:
    void call(Interface& interface)
    {
        interface.foo();
        assert(false);
    }
};


TEST(BarTest, call_fooGetsCalledAndDies)
{
    InterfaceMock mock;

    EXPECT_CALL(mock, foo());

    ASSERT_DEATH({ Bar().call(mock); }, "");
}

测试失败,因为对 mock.foo() 的预期调用未能断言:

Running main() from gmock_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from BarTest
[ RUN      ] BarTest.call_fooGetsCalledAndDies

[WARNING] /tmp/tmp.sHHkM/gmock-1.7.0/gtest/src/gtest-death-test.cc:825:: Death tests use fork(), which is unsafe particularly in a threaded context. For this test, Google Test couldn't detect the number of threads.
foo.cc:31: Failure
Actual function call count doesn't match EXPECT_CALL(mock, foo())...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] BarTest.call_fooGetsCalledAndDies (1 ms)
[----------] 1 test from BarTest (1 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (2 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] BarTest.call_fooGetsCalledAndDies

 1 FAILED TEST

有趣的是,如果注释了 EXPECT_CALL(mock, foo()) 行,Google Mock 会针对对 mock.foo() 的意外调用发出警告:

Running main() from gmock_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from BarTest
[ RUN      ] BarTest.call_fooGetsCalledAndDies

[WARNING] /tmp/tmp.sHHkM/gmock-1.7.0/gtest/src/gtest-death-test.cc:825:: Death tests use fork(), which is unsafe particularly in a threaded context. For this test, Google Test couldn't detect the number of threads.

GMOCK WARNING:
Uninteresting mock function call - returning directly.
    Function call: foo()
Stack trace:
[       OK ] BarTest.call_fooGetsCalledAndDies (1 ms)
[----------] 1 test from BarTest (1 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.

我想这在某种程度上与使用 fork() 和线程的死亡测试警告有关,但我无法将所有部分匹配在一起。

最佳答案

这是一个 known limitation死亡测试。在内部 assert_death fork ,因此在子进程中调用的模拟不会在父进程中注册。如果您希望抑制警告,请考虑使用 NiceMock

关于c++ - 使用模拟和死亡测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32458503/

相关文章:

c++ - 为什么我在使用 C++ 友元函数时会出错?

c++ - 为什么用项目编译 gtest 而不是使用 lib

c - GoogleTest 在特定测试中强制 #undef

c++ - 特征矩阵常量类型

c++ - 编译器无法推断出要返回哪种模板类型

c++ - Arduino 类层次结构、字符串和内存泄漏

ruby - 如何使用 minitest 为实例中的方法调用设置默认值?

unit-testing - React.js 和 Jasmine Spies

java - getRequests() 必须返回一个可迭代的数组

c - 如何使用 Google 测试 C 语言测试覆盖函数将 char 数组转换为结构的所有分支