使用 GoogleTest 进行测试时,派生类中的虚拟函数未被调用
virtual function in derived class not getting called when testing with GoogleTest
我在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
。
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数