3

我正在尝试使用 google test 测试我的 C 库,但在使用fff.h框架模拟函数时遇到问题。这是我的文件结构:

.
├── 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框架的函数中使用。

public_function()
{
        private_function(); //This function is the one I want to mock.
}

我的测试如下所示:

#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样子是这样的:

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
4

1 回答 1

1

我有一个解决方案,但我不确定它是否是最好的。

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

生成的.o文件src/libmylib/是:

libmylib_la-libmylib.o
libmylib_la-private_functions.o

我的更新MakeFile.am现在./test/libmylib_test/看起来像这样:

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我也不得不模拟那个函数,因为它没有在其他地方定义。

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

测试文件现在看起来像这样:

#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 *);
...
于 2019-12-12T08:19:13.203 回答