首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用gmock实现阻塞模拟函数?

如何用gmock实现阻塞模拟函数?
EN

Stack Overflow用户
提问于 2020-11-29 11:42:31
回答 1查看 217关注 0票数 0

在我的项目中,我需要模拟一个运行在线程上的阻塞函数,我需要它在测试期间用我的控件释放线程几次,在我的命令下,我希望它大部分时间被阻塞,因为读函数在while循环中。

代码语言:javascript
复制
class BlockFuncsIf {
public:
    virtual bool Write(const Msg& msg) = 0;
    virtual bool Read(Msg* msg) = 0;

};

class BlockFuncs: public BlockFuncsIf {
public:
    MOCK_METHOD1(Write, bool(const Msg&));
    MOCK_METHOD1(Read, bool(Msg* msg));
};


class TestedClass {
public:
    MSG msg;
    std::condition_variable cv;
    bool success;

    ...

    bool expectRead() {
        success = true;
        while(success) {
            success = Read(&msg);
            cv.notify_all();
        }
    }

    ...

};    
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-29 11:42:31

我找到的解决方案是包装模拟的函数,并添加一个信号量来控制阻塞。在这个解决方案中,我从测试中控制信号量(sem_init,sem_post)。

注意:我想使用std::semaphore,但是它只能在c++20上使用,所以我使用了semaphore.h insted,如果需要的话,还有一些其他的cpp信号量的实现:cpp semaphore implementation

代码语言:javascript
复制
class BlockFuncsIf {
public:
    virtual bool Write(const Msg& msg) = 0;
    virtual bool Read(Msg* msg) = 0;
};

class BlockFuncsMock: public BlockFuncsIf {
public:
    MOCK_METHOD1(Write, bool(const Msg&));
    MOCK_METHOD1(Read, bool(Msg* msg));

    static std::shared_ptr<BlockFuncsMock> _blockFuncsMockObj;
};

std::shared_ptr<BlockFuncsMock> BlockFuncsMock::_blockFuncsMockObj = std::make_shared< BlockFuncsMock >();

class BlockFuncs {
public:
    bool Write(const Msg& msg){
        sem_wait(&SemWriteMutex);
        return BlockFuncsMock::_blockFuncsMockObj->Write(msg);
    }
    bool Read(Msg* msg){
        sem_wait(&SemReadMutex);
        return BlockFuncsMock::_blockFuncsMockObj->Read(msg);
    }
    sem_t SemWriteMutex;
    sem_t SemReadMutex;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65059706

复制
相关文章

相似问题

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