c++ - 如何在 C++ 中使用 gtest/gmock 为调用另一个全局函数的全局函数编写单元测试?

标签 c++ unit-testing googletest googlemock

我的文件中有大约 10 个全局函数。需要为他们每个人编写单元测试用例。可以从另一个全局函数调用一个全局函数。

您可以考虑以下三个全局函数。

int bar(int n){
    ..........
    //Could call another global function.
    ..........
}

int foo(int n){
    ..........
    int b = bar(x);
    ..........
}

int hut(int n){
    ..........
    ..........  
    int a = foo(x);
    ..........
    ..........  
    int b = hut(y);
    ..........
    ..........
}

在测试 hut() 时,foo() 和 bar() 函数应该被模拟。 foo() 和 bar() 也会发生同样的事情。我正在使用 gtest 和 gmock。是否可以使用 gtest 和 gmock?

感谢阅读。

最佳答案

如果它们在同一个文件中,很遗憾没有(理智的)方法来模拟这些全局函数。即使它们不是,您也很难做到这一点(例如,在构建单元测试代码时,将原始代码修改为 #include 模拟 header 而不是真实 header ),并且它将漂亮,所以我强烈建议您不要这样做。

虽然有一个third party extension添加全局模拟支持,它只有助于创建模拟,但不幸的是,“我如何让我的函数改为调用模拟” 问题。

他们在 this FAQ 中对此进行了介绍甚至提供可能的解决方法 in their Blog - 您可以重写您的代码以“摆脱”静态全局函数并使您的代码可测试。

简而言之:不,没有好的和简单的方法来模拟全局函数(特别是如果它们调用其他全局函数),您最好将代码重构为更可测试的东西。

关于c++ - 如何在 C++ 中使用 gtest/gmock 为调用另一个全局函数的全局函数编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348354/

相关文章:

C++ 有效函数指针为空

c++ - 强制编译器只接受编译时参数( float )

c# - 从同一方法模拟两个不同的结果

c++ - GTest 中的嵌套匹配器

c++ - 构造函数采用参数时的GTest夹具?

c++ - 使用 CMake 生成的系统在构建时运行 Google 测试

c++ - 严格弱排序和 std::set/std::map

c++ - 在我的项目中包含 C++ 库的最佳实践

node.js - Mocha 重试不起作用

unit-testing - 打开和读取文件的单元测试功能