使用嘲笑和死亡测试

时间:2015-09-08 12:58:53

标签: c++ unit-testing googletest googlemock

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

检查以下示例:

public class JsonUtil {

private static JsonUtil instance;

private Gson gson = null;

private JsonUtil() {
    gson = new GsonBuilder()
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getDeclaringClass().equals(RealmObject.class);
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            })
            .create();
}

public static <T> T jsonToObject(String json, Class<T> toClass) throws Exception {
    if (instance == null) {
        instance = new JsonUtil();
    }
    return instance.gson.fromJson(json, toClass);
}

public static <T> T jsonToObject(InputStream databaseInputStream, Class<T> toClass) throws Exception {
    if (instance == null) {
        instance = new JsonUtil();
    }
    return instance.gson.fromJson(new InputStreamReader(databaseInputStream), toClass);
}

public static <T> String objectToJson(Object o, Class<T> toClass) throws Exception {
    if (instance == null) {
        instance = new JsonUtil();
    }
    return instance.gson.toJson(o, toClass);
}
}

测试失败,因为对#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 行被评论,Google Mock会针对EXPECT_CALL(mock, foo())的意外通话发出警告:

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. 和线程的死亡测试警告有某种关系,但是我无法将所有部分匹配在一起。

1 个答案:

答案 0 :(得分:4)

这是known limitation的死亡测试。内部assert_death分叉,因此子进程中调用的模拟未在父进程中注册。如果您希望取消警告,请考虑使用NiceMock