使用GoogleTest进行测试时,派生类中的虚函数未被调用

时间:2016-11-09 19:21:12

标签: c++ qt googletest

我在使用GoogleTest调用我在派生类中定义的虚函数时遇到了问题。

我使用从QTcpServer派生的Qt创建了一个MyServer类。当我在GoogleTest之外运行此代码时,程序会按预期运行。当我使用GoogleTest创建一个项目时,我的类中的incomingConnection永远不会被调用。接受套接字,就好像QTcpServer :: incomingConnection接收呼叫一样。

MyThread将发出一个信号ReadySocket(),它通常连接到创建MyServer的任何人。在测试时,我创建了一个MyServerTester类,它将接收信号并设置一个我可以断言的标志。

我可以将问题简化为以下代码在incomingConnection中设置断点,启动服务器,使用客户端连接到它。将接受连接,不会输入MyServer :: incomingConnection,因此永远不会创建MyThread。

项目:服务器文件:MyServer.h

class MyServer : public QTcpServer
{
    Q_OBJECT

public:
    MyServer(QObject *parent = 0);

protected:
    void incomingConnection(qintptr socketDescriptor) Q_DECL_OVERRIDE;
}

项目:服务器文件:MyServer.cpp

#include "MyServer.h"

MyServer::MyServer(QObject *parent) : QTcpServer(parent) { }

void MyServer::incomingConnection(qintptr socketDescriptor)
{
    MyThread *thread = new MyThread(socketDescriptor, this);
    connect( thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
}

项目:Server_Test文件:main.cpp

#include <QtCore/QCoreApplication>
#include "gtest\gtest.h"
#include "..\Server\MyServer.h"

TEST(MyServer, Successful_Connection)
{
    MyServer server;
    server.listen(QHostAddress::AnyIPv4, 4444);
    QThread::sleep(30);
}

int main(int argc, char*argv[])
{
    QCoreApplication a(argc, argv);
    ::testing::InitGoogleTest(&argc, argv);
    RUN_ALL_TESTS();

    return a.exec()
}

2 个答案:

答案 0 :(得分:1)

第一个观察是这些不是单元测试,是更多的集成测试,因为它们使用网络和Qt事件循环。

问题是您正在测试需要运行Qt事件循环(a.exec()调用)的Qt信号。但是在main中,您实际上是在启动事件循环之前运行测试。我不确定尝试在gtest中窃取Qt事件循环是值得的。

我建议采用另一种方法:使用Qt Test,它完全适应Qt事件循环,并且有一个非常方便的信号间谍来验证信号传播。

答案 1 :(得分:0)

问题是server对象在TEST结束后被销毁。 可能会尝试

QTcpServer *server;
TEST(MyServer, Successful_Connection)
{
 server = new MyServer;
 server->listen(QHostAddress::AnyIPv4, 4444);
 QThread::sleep(30);
}

并在server完成后删除TEST