我正在使用Qt的QTestLib单元测试框架+ GMOck。
我正在尝试使用gMock设置模拟服务器,以在单元测试中简单地将数据从QTcpSocket接收到VerifySendData()方法。
如果有人给我一个例子,说明我如何创建模拟对象gMOCK(预期调用,创建模拟对象)
#ifndef TST_TCPCOMMTEST_H
#define TST_TCPCOMMTEST_H
#include <QtCore/QString>
#include <QtTest/QtTest>
#include <QTcpSocket>
#include <QTcpServer>
class TcpCommTest : public QObject
{
Q_OBJECT
private:
QTcpSocket* pTestSocket;
QTcpSocket* pMockSocket;
QTcpServer* pMockServer;
public:
TcpCommTest();
public slots:
void connectMockServer();
private Q_SLOTS:
void initTestCase();
void VerifySendData();
void cleanupTestCase();
};
#endif // TST_TCPCOMMTEST_H
#include "tst_tcpcommtest.h"
#include <QtDebug>
#include <QtCore/>
#include <QtTest/QtTest>
#include <QtNetwork/QtNetwork>
#include <gmock/gmock.h>
void TcpCommTest::connectMockServer()
{
cout << "connection attempt" << endl;
pMockSocket = pMockServer->nextPendingConnection();
}
void TcpCommTest::initTestCase()
{
pMockSocket = NULL;
pMockServer = new QTcpServer();
//I want to use gMock here to create MockTCP Server
EXPECT_CALL(pMockServer,someMethod(1).Times(AtLeaset(1));
EXPECT_CALL(pMockServer,someMethod(2).Times(AtLeaset(1));
//pMockServer->listen( QHostAddress("127.0.0.1"), 2000 );
//connect( pMockServer, SIGNAL(newConnection()), SLOT(connectMockServer()) );
pTestSocket = new QTcpSocket();
pTestSocket->connectToHost( QHostAddress("127.0.0.1"), 2000 );
QVERIFY( pTestSocket->waitForConnected( 1000 ) );
QVERIFY( pTestSocket->state() == QTcpSocket::ConnectedState );
}
void TcpCommTest::VerifySendData()
{
int i=0;
QVERIFY( pMockSocket != NULL );
}
QTEST_MAIN(TcpCommTest);
最佳答案
我没有足够的声誉来发表评论,但我不知道您想要实现什么目标。
您尝试测试的应用是主机还是客户端?
无论如何,您不能致电:
pMockServer = new QTcpServer();
EXPECT_CALL(pMockServer,someMethod(2))
pMockServer必须通过MOCK_METHOD1宏模拟了someMethod。
如果someMethod在QTcpServer中是虚拟的,则QTcpServerMock可以从QTcpServer派生而得
MOCK_METHOD1(someMethod, void(int))
如果并非所有要模拟的方法都是虚拟的,则无法使用MOCK_METHOD1覆盖它。我将创建由TcpServer和TcpServerMock派生的TcpServerInterface。 someMethod在TcpServerInterface中是虚拟的,在TcpServer中是真正实现的,并由TcpServerMock中的宏模拟。
真正的TcpServer可以将QTcpServer作为私有(private)成员,然后将其包装。