在可执行文件中实现静态方法是否安全,该方法已在共享库中实现?

时间:2012-09-10 15:23:58

标签: c++ unit-testing mocking

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

我们想要这样做的方法是在测试二进制文件中重新实现该方法。这样就可以确保我们的实现取代了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作为编译器,库是动态链接的。

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

2 个答案:

答案 0 :(得分:2)

您将违反One Definition Rule。链接器的工作方式可能会对你有用,但这是一场赌博而且没有任何保证。

答案 1 :(得分:2)

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

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