[solved] Mocking the database example



  • Hi! Does anyone have some examples how to Mock the database with Qt? I've been searching the internet and cannot understand how to do it.
    From what I've read we cannot use any 3rd party tools (GoogleMock, Hippo Mocks, etc) and we should use qttestlib and QtSignalSpy, but I cannot figure out how to do it.
    I'm new to Unit testing, I have already a project which has connections to the database and to a Serial Port, and would like to add the tests now, mocking the Database and the Serial Port connection. If someone could post an example with something like this it would be great!


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    If you are using QSerialPort then you can create your own QIODevice that should answer like it's a QSerialPort.

    As for the database you can generate one in memory using sqlite.

    Hope it helps



  • Hi! Thank you for your post.
    I saw you made a conference with this subject. Is it possible to have access to the video or the demo?

    Thanks!


  • Lifetime Qt Champion

    AFAIK, the video will be released after the San Francisco Qt DevDay.

    The code itself I must clean a bit



  • Ok, thanks.
    But in the meanwhile, can someone give me an example how I would "fake" and test a QSerialPort read() and write() methods?

    This is really the first Unit test I'm implementing, so excuse me my ignorance.

    Thank.


  • Lifetime Qt Champion

    In short, use a custom QIODevice in place of your QSerialPort.

    So the class that uses QSerialPort should have a setDevice(QIODevice *device) so you can choose which one to use.



  • I understand that, I just don't know how to (and what to) test, for example, the read and write methods.


  • Lifetime Qt Champion

    Quick example:

    @
    class MockupDevice : public QIODevice
    {
    Q_OBJECT
    public:
    explicit MockupDevice(QObject *parent = 0);

    qint64 bytesAvailable() const Q_DECL_OVERRIDE;
    

    protected:
    qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE;
    qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE;

    private:
    QByteArray _outputBuffer;
    };
    @

    @
    MockupDevice:: MockupDevice(QObject *parent)
    : QIODevice(parent)
    {
    }

    qint64 MockupDevice::bytesAvailable() const
    {
    return _outputBuffer.size() + QIODevice::bytesAvailable();
    }

    qint64 MockupDevice::readData(char *data, qint64 maxlen)
    {
    if (_outputBuffer.size() == 0) {
    return 0;
    }

    qint64 len = qMin((qint64)_outputBuffer.size(), maxlen);
    
    QByteArray out = _outputBuffer.left(len);
    _outputBuffer.remove(0, len);
    
    memcpy(data, out.data(), len);
    return len;
    

    }

    qint64 MockupDevice::writeData(const char *data, qint64 len)
    {
    // process the data you wrote in your device
    // put the answer in _outputbuffer
    if (_outputBuffer.size() > 0) {
    emit readyRead();
    }

    return len;
    

    }
    @

    Hope it helps



  • Yes, it helped. And, to finish... can you post an example of an actual test? With how would you use this MockupDevice?

    Many thanks!


  • Lifetime Qt Champion

    @
    #include <QtTest>

    #include "mockupdevice.h"

    #include <QBuffer>

    class Tst_usingmockup : public QObject
    {
    Q_OBJECT

    private Q_SLOTS:
    void test();
    };

    void Tst_usingmockup::test() const
    {
    MyCoolClass mcc;
    MockUpdevice *device = new MockupDevice;
    mcc.setDevice(device)
    // execute mcc functions
    // check mcc functions return value if any
    // check device content etc.
    }

    QTEST_APPLESS_MAIN(Tst_usingmockup)

    #include "tst_usingmockup.moc"
    @



  • Thank you very much for the help! I think I can go alone from here ;-)


  • Lifetime Qt Champion

    You're welcome !

    Don't forget to also add a unit test for the mockup object to be sure it's acting correctly.

    If your question is answered, please update the thread title prepending [solved] so other forum users may know a solution has been found :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.