首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ Gmock WillOnce -除了返回值之外,您还能做任何事情吗?

C++ Gmock WillOnce -除了返回值之外,您还能做任何事情吗?
EN

Stack Overflow用户
提问于 2021-05-27 13:16:06
回答 1查看 380关注 0票数 0

当其中一个模拟方法被调用时,我正在学习gmock,并想知道如何才能让模拟对象做一些事情。

我需要模拟一些使用Qt的接口,并且我正在尝试让Qt和Gmock一起工作。

例如,我模拟了一个网络套接字接口类,通过基于DI的构造函数将它交给了一个网络客户端类,我想告诉模拟套接字调用它的方法之一,在连接完成时向客户机发送信号,以便假装连接已经建立。

我看到了WillOnce,它需要和“操作”,但我正在阅读的文档并没有真正解释“动作”可以是什么类型的东西。所有的例子都只是返回一些东西或增加一个全局变量。您能调用属于您正在模拟的抽象类的方法吗?

如果不是,我看到您可以单独定义一个假对象,并使其成为模拟的成员,然后委托,但在每个需要不同行为的测试用例中,这似乎是一项艰巨的工作。

  • 您必须定义您的界面中的每个纯虚拟的,不管您是否想将它用于特定的测试用例
  • ,似乎我将不得不创建不同的假象,因此当假行为不同时,每个测试用例都会产生不同的模拟.例如,我希望在一个测试用例a中打开信号,而不是在另一个

中发出信号。

下面是一些示例代码:

代码语言:javascript
复制
class MySocketInterface : QObject
{
    Q_OBJECT
    public:
   
       virtual void connect(std::string url) = 0;
       
    signal:    // Specific to Qt, but this is what I need to call
       // Notifies subscribers
       void connected();
 }

 class MyThingToTest
 {
 public:
     MyThingToTest(std::unique_ptr<MySocketInterface> && socket);
     void connect(std::string url);
     State getState() const;
 private:
     std::unique_ptr<MySocketInterface> m_socket;
     // Changes state to connected
     void onConnected();
 }

 Test1:
 ) Make a mock socket
 ) Give it to MyThingToTest
 ) Call MyThingToTest::connect
 ) mock socket needs to send notification faking connecting by calling `emit connected`
 ) Check if MyThingToTest is in connected state

 Test2:
 ) Make a mock socket
 ) Give it to MyThingToTest
 ) Call MyThingToTest::connect
 ) mock socket needs to not send notification, and 30 seconds needs to elapse.
 ) Check if MyThingToTest is in an error state

我希望避免不得不定义一个全新的假类,并模拟每个操作不同的单元测试用例。

请注意,我不是寻找QSignalSpy或验证信号和插槽。我想验证我的类的功能,这些类对它们有反应,并且让这些类使用模拟依赖关系,这样我就不必在真实的网络上交谈了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-27 16:33:23

假设您使用的是Qt 5或更高版本,您应该能够使用InvokeWithoutArgs来实现您想要的结果。您的模拟对象应该定义如下:

代码语言:javascript
复制
class MockMySocketInterface : public MySocketInterface
{
    Q_OBJECT
public:
    MockMySocketInterface() { }
    virtual ~MockMySocketInterface() { }

    MOCK_METHOD1(connect, void(std::string));
};

您的测试结果如下所示:

代码语言:javascript
复制
auto socket = std::make_unique<MockMySocketInterface>(); // Could also use NiceMock here.

// This could alternately be an EXPECT_CALL, but you would need to use WillOnce
// or WillRepeatedly instead of WillByDefault.
ON_CALL(*socket, connect(_))
    .WillByDefault(InvokeWithoutArgs(socket.get(), &MockMySocketInterface::connected));
MyThingToTest thing(socket);

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

https://stackoverflow.com/questions/67722938

复制
相关文章

相似问题

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