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

virtual function in derived class not getting called when testing with GoogleTest

本文关键字:虚拟 函数 调用 派生 GoogleTest 测试 使用      更新时间:2023-10-16

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

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

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

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

项目:服务器

文件:我的服务器.h

class MyServer : public QTcpServer
{
    Q_OBJECT
public:
    MyServer(QObject *parent = 0);
protected:
    void incomingConnection(qintptr socketDescriptor) Q_DECL_OVERRIDE;
}
项目:服务器

文件:我的服务器.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 文件:主.cpp

#include <QtCore/QCoreApplication>
#include "gtestgtest.h"
#include "..ServerMyServer.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()
}

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

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

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

问题是一旦TEST结束,您的server对象就会被销毁。可以尝试

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

并在TEST完成后删除server