【问题标题】:Is it safe to implement a static method in your executable, which is already implemented in a shared library?在您的可执行文件中实现静态方法是否安全,该方法已在共享库中实现?
【发布时间】:2012-09-03 11:59:52
【问题描述】:

我们在代码中使用了很多共享库。在这种特殊情况下,在这些库之一中实现了一个静态方法。我们在代码的不同位置调用此方法。但是,如果我们想测试,我们希望隔离进程,因此模拟该方法的实现。

我们考虑这样做的方式是在测试二进制文件中重新实现该方法。这将确保我们的实现被采用而不是 lib 中的实现。

这里的主要问题是:这是纯粹的邪恶吗?如果是这样,这种情况下的首选解决方案是什么?

一个例子...

共享库的头文件:

static const bool theMethod(...);

共享库中方法的实现:

static const bool theMethod(...){
  //The real implemetation does some fancy stuff here
  return theRealValue;
}

我们的测试用例:

#include <headerOfTheMethod.hpp>

//Our own "mocked" implementation
static const bool theMethod(...){
  return true; //Lets say we always return true for the purpose of our test
}

//Here comes our code testing the class which is using that particular method

旁注:我们使用 gcc 作为编译器,库是动态链接的。

更新: 如果这适用于静态方法。这将是一个很好的开始,但如果它是一个类的成员函数会发生什么?

【问题讨论】:

  • 类的静态成员函数类的成员函数。 C++ 中没有“方法”之类的东西,如果您使用“方法”期望人们理解您的意思是静态成员函数,那么您会愚弄我一个;-) 如果您说“成员”也是如此函数”期望人们理解“非静态成员函数”。
  • 您应该在代码中更明确地说明您正在讨论的静态成员函数

标签: c++ unit-testing mocking


【解决方案1】:

您将违反One Definition Rule。链接器的工作方式可能对您有用,但这是一场赌博,无法保证。

【讨论】:

  • 但是使用 LD_PRELOAD 覆盖方法,例如 mallocfree 是常见的做法,似乎违反了这条规则,并且可以可靠地工作。
【解决方案2】:

是的,它是安全的,只要:

  1. 您的方法与您在外部覆盖的方法相同
  2. 您可以避免链接器错误。检查您的编译器文档,但应该有一种方法可以将符号设为“弱”,因此它不会抱怨多个定义。这是为了测试目的而覆盖系统库中的函数以挂钩调用的标准方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2012-02-07
    • 2011-09-24
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多