[QTestLib] QTestLibを使ってみる2(privateメソッドのテスト)

privateメソッドのテストコードを書こうとすることは邪道かもしれないけど、書きたくなる場合もあるんじゃないかな? すごく長いメソッドだったり、すごく複雑だったり、すごくスパゲッティだったりさ。

で、privateメソッドのテストコードの書き方を考えていたら、

privateをpublicにdefineすればいいよ

と、C言語erから悪魔のささやきを得たので試してみた。

0. テスト対象

privateメソッドを有する次のようなクラスを対象とする。
自身のメンバ変数の値を取得するprivateメソッドとかすごくバカっぽい・・・
もう少しまともなサンプル思いつかなかったのかと後悔・・・

sampleclass2.h
#ifndef SAMPLECLASS2_H
#define SAMPLECLASS2_H

class SampleClass2
{
public:
    SampleClass2();
    SampleClass2( const int data );
    virtual ~SampleClass2();

private:
    int privateMethod() const;

private:
    int m_data;
};

#endif // SAMPLECLASS2_H
sampleclass2.cpp
#include "sampleclass2.h"

SampleClass2::SampleClass2()
    : m_data()
{
}

SampleClass2::SampleClass2( const int data )
    : m_data(data)
{
}

SampleClass2::~SampleClass2()
{
}

int SampleClass2::privateMethod() const
{
    return m_data;
}

1. テストコード

言われた通りにprivateをpublicにdefineして、テストクラスからprivateメソッドを呼べるようにする。

tst_privatemethodtest.cpp
#include <QtCore/QString>
#include <QtTest/QtTest>

#define private public
#include "sampleclass2.h"
#undef  private

class PrivateMethodTest : public QObject
{
    Q_OBJECT

public:
    PrivateMethodTest();

private Q_SLOTS:
    void test_privateMethod();
};

PrivateMethodTest::PrivateMethodTest()
{
}

void PrivateMethodTest::test_privateMethod()
{
    SampleClass2 obj(10);
    QCOMPARE( obj.privateMethod(), 10 );
}

QTEST_APPLESS_MAIN(PrivateMethodTest);

#include "tst_privatemethodtest.moc"

一応これでprivateメソッドもテストできるけど・・・

あるメソッドがキモくてキモくて仕方がなくて、動作があやしくて、privateだけど仕方なく無理やりテストしようかなって場合はこれでいいかもね。