首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUnit -‘模拟’libc函数

CUnit -‘模拟’libc函数
EN

Stack Overflow用户
提问于 2011-12-01 17:32:56
回答 2查看 2.7K关注 0票数 4

我正在使用CUnit进行我的项目单元测试。我需要测试是否使用正确的参数调用libc函数&是否正确处理它们的返回值。例如:如果我调用bind(...)函数-我想检查我传递了哪个af参数&如果这是错误的,我也想模拟它的返回值&断言,如果我以正确的方式检查它。

出于这些目的,我希望CUnit环境有一个内置的机制,让我在测试时调用一个'mocked‘bind()函数,在运行代码时调用一个真正的bind()函数--但我找不到这样的东西。

如果我在CUnit中遗漏了什么,你能告诉我吗,或者建议一种实现它的方法。

谢谢,乔。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-01 17:48:30

不幸的是,你不能用CUnit模拟C中的函数。

但是您可以通过使用和滥用定义来实现您自己的模拟函数:假设您在编译测试时定义了UNITTEST,您可以在测试文件(或在include中)中定义如下内容:

代码语言:javascript
复制
#ifdef UNITTEST
    #define bind mock_bind
#endif

在将在测试模式下编译的mock_helper.c文件中:

代码语言:javascript
复制
static int mock_bind_return;    // maybe a more complete struct would be usefull here
static int mock_bind_sockfd;

int mock_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
    CU_ASSERT_EQUAL(sockfd, mock_bind_sockfd);
    return mock_bind_return;
}

然后,在您的测试文件中:

代码语言:javascript
复制
extern int mock_bind_return;
extern int mock_bind_sockfd;

void test_function_with_bind(void)
{

   mock_bind_return = 0;
   mock_bind_sockfd = 5;
   function_using_bind(mock_bind_sockfd);
}
票数 5
EN

Stack Overflow用户

发布于 2017-03-12 10:30:22

glibcmock是一个用Google Test模拟libc函数的解决方案。例如:

代码语言:javascript
复制
#include "got_hook.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

#include <sys/socket.h>

#include <mutex>
#include <memory>

struct MockBind {
    MOCK_METHOD3(Bind, int(int, const struct sockaddr*, socklen_t));
};

static MockBind *g_mock{nullptr};

static int Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
    return g_mock->Bind(sockfd, addr, addrlen);
}

static std::mutex g_test_mutex;

TEST(BindTest, MockSample) {
    std::lock_guard<std::mutex> lock(g_test_mutex);
    std::unique_ptr<MockBind> mock(g_mock = new MockBind());
    testing::GotHook got_hook;
    ASSERT_NO_FATAL_FAILURE(got_hook.MockFunction("bind", (void*)&Bind));
    // ... do your test here, for example:
    struct sockaddr* addr = nullptr;
    EXPECT_CALL(*g_mock, Bind(1, addr, 20)).WillOnce(testing::Return(0));
    EXPECT_EQ(0, bind(1, addr, 20));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8339094

复制
相关文章

相似问题

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