google mock link 模拟 C 函数时出错

google mock link error with mocking C function

我有以下代码,我尝试使用 google 模拟来模拟 C 函数:

这是头文件:

A.h

int getValue(int age, int* value, int* number);

这是源文件:

A.c

int getValue(int age, int* value, int* number)
{
    // do something and return value
    return 10;
}

这是源文件 b.c,它使用 a.h

b.c

#include <a.h>

void formValue()
{
   int b = 10;
   int c = 20;
   getValue(1, &b, &c);    
}

这是模拟文件:

AMock.hh

#include "a.h"

class AFileMock {
  public:
    AFileMock();
    ~AFileMock();
    MOCK_METHOD3(getValue, int(int, int *, int *));
};

然后在测试中:

#include "gmock/gmock.h"
#include "gtest/gtest.h"

#include <b.h>
#include <AFileMock.h>

using testing::_;
using testing::Return;
using testing::InSequence;

class BTest: public testing::Test {

protected:
   AFileMock aFile;

public:
   void SetUp() { }
   void TearDown() { }
};


TEST_F(BTest, test1)
{
   InSequence sequence;
   EXPECT_CALL(aFile, getValue(_, _, _)).
      Times(1);

   formValue();
}

当我尝试 运行 这个测试时,它抱怨 Mock 文件中的 get link 错误,它说:

link error: getValue(_, _, _) is not defined,指向Mock文件AMock.hh.

但是如果我在 Mock 中使用 MOCK_CONST_METHOD 而不是 MOCK_METHOD,它会起作用:

MOCK_CONST_METHOD3(getValue, int(int, int *, int *));

没有编译器错误。

这是什么原因?

替换

AMock.hh

#include "a.h"

AMock.hh

extern "C" {
    #include "a.h"
}

原因如下:In C++ source, what is the effect of extern "C"?