首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用google测试的FFF假函数

使用google测试的FFF假函数
EN

Stack Overflow用户
提问于 2019-12-11 14:26:09
回答 2查看 2.8K关注 0票数 4

我正试图用google测试我的C库,但我在用fff.h框架模拟函数时遇到了困难。这是我的文件结构:

代码语言:javascript
代码运行次数:0
运行
复制
.
├── Makefile.am
├── configure.ac
├── include
│   ├── Makefile.am
│   └── public_header.h
├── src
│   └── libmylib
│       ├── Makefile.am
│       ├── private_functions.c
│       ├── private_functions.h
│       ├── libmylib.la
│       └── libmylib.c
└── test
    └── libmylib_test
        ├── Makefile.am
        ├── fff.h
        └── test.cc

我想从头private_functions.h中模拟一个函数,这个函数在public_header.h的函数中使用fff.h框架。

代码语言:javascript
代码运行次数:0
运行
复制
public_function()
{
        private_function(); //This function is the one I want to mock.
}

我的测试看起来如下:

代码语言:javascript
代码运行次数:0
运行
复制
#include "gtest/gtest.h"
#include "public_header.h"
#include "fff.h"

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

DEFINE_FFF_GLOBALS;

FAKE_VALUE_FUNC(int, function, char *, char *);

class libtest : public testing::Test
{
public:       
    virtual void SetUp()
    {
        RESET_FAKE(function);
    }

    virtual void TearDown()
    {
    }
};

TEST_F(libtest, test_fff)
{
    public_function("val1", "val2");
    EXPECT_EQ(function_fake.call_count, 1);
}
...

当我运行时,make会说private_function()是多次定义的。

我的test/libmylib_test/MakeFile.am看起来是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
LIBSRC = $(top_srcdir)/src/libstorage

check_PROGRAMS = libmylib_test
libstorage_test_SOURCES = test.cc
libstorage_test_CFLAGS = $(AM_CFLAGS)
libstorage_test_CXXFLAGS = -I$(top_srcdir)/include -I$(LIBSRC) -std=c++11 $(AM_CPPFLAGS)
libstorage_test_LDFLAGS = $(AM_LDFLAGS) -static -pthread
libstorage_test_LDADD = $(top_srcdir)/src/libmylib/libmylib.la
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-12 08:19:13

我有一个解决办法,但我不确定这是否是最好的解决办法。

当我编译我的库时,我想要测试它为我拥有的每个.o文件生成.c文件。由于我只想测试libmylib.c,所以我只链接了libmylib_la-libmylib.o而不是.la文件。

.o中生成的src/libmylib/文件如下:

代码语言:javascript
代码运行次数:0
运行
复制
libmylib_la-libmylib.o
libmylib_la-private_functions.o

我在./test/libmylib_test/中更新的./test/libmylib_test/现在如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
LIBSRC = $(top_srcdir)/src/libstorage

check_PROGRAMS = libmylib_test
libstorage_test_SOURCES = test.cc
libstorage_test_CFLAGS = $(AM_CFLAGS)
libstorage_test_CXXFLAGS = -I$(top_srcdir)/include -I$(LIBSRC) -std=c++11 $(AM_CPPFLAGS)
libstorage_test_LDFLAGS = $(AM_LDFLAGS) -static -pthread
libstorage_test_LDADD = $(top_srcdir)/src/libmylib/libmylib_la-libmylib.o

由于我在private_functions.h中有另一个函数,所以我也不得不模拟这个函数,因为它不是在其他地方定义的。

在这些更新之后,这些测试编译后没有问题,运行良好。

测试文件现在看起来如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
#include "gtest/gtest.h"
#include "public_header.h"
#include "fff.h"

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

DEFINE_FFF_GLOBALS;

FAKE_VALUE_FUNC(int, function, char *, char *);
FAKE_VOID_FUNC(other_func, char *);
...
票数 1
EN

Stack Overflow用户

发布于 2022-10-12 16:43:41

这是一个链接问题,您不能将源文件包含在您正在模拟/伪造的函数中。最简单的解决方法是将测试中的代码编译为共享库,并将测试链接到该库。当您运行测试时,动态链接器将发挥其魔力,不会从动态加载伪造的函数,因为它们已经存在于应用程序代码中(通过模拟的函数)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59287962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档