2017-11-22 12 views
2

以下の例に似たC++コードがあります。 mFlashLamp.triggerがちょうど5回呼び出されたことを確認するための単体テストを作成したいと思います。 しかし、今まで私はこれを行う良い方法を理解することができませんでした。ユニット変数のインスタンス関数の呼び出しをテストします

は、私は、次の制約があります:ミスラ/ GoogleTest/GoogleMock

include <iostream> 

class FlashLamp 
{ 
public: 
    virtual void trigger(){ 
     std::cout << "Trigger FlashLamp" << std::endl; 
    } 
}; 

class Spectrometer 
{ 
public: 
    FlashLamp mFlashLamp; 

    void foo(){ 
     for(int i=0; i<5; i++){ 
      mFlashLamp.trigger(); 
     } 
    } 

}; 

int main(){ 
    Spectrometer S; 
    S.foo(); 
    return 0; 
} 

へ コンプライアンスは誰もがユニットテストのために良いときれいな解決策を持っています。私は考えることができる 一つの解決策は、

class Spectrometer 
{ 
public: 
    FlashLamp mFlashLamp; 
    FlashLamp* pFlashLamp; 
} 

にあるインスタンス変数への追加のポインタを持っており、トリガーにアクセスするためにこれを使用します。しかし、これは、すべての逆参照に対してヌルポインタチェックを必要とするため、一部のコードが肥大化することを意味します。 誰かがより良い解決策を考えていますか?

PS: 私は本当にいいタイトルを考え出しましたが、できませんでした。誰かが改善している場合は、自由に編集してください。

+0

それはあなたが実際にテストしたいものを、少し不明です。 'spectrometer'クラスから' trigger() 'を何度も呼び出したいのですか? – user0042

答えて

1

ユニットテストにおける慣用の方法はインタフェースモッククラス使用することです:あなたはあなたが検査することができますモッククラスとのインタフェースを実装します

#include <iostream> 

// The interface definition 
struct IFlashLamp { 
    virtual ~IFlashLamp() {} 
    virtual void trigger() = 0; 
}; 

class FlashLamp : public IFlashLamp 
{ 
public: 
    virtual void trigger() override { 
     std::cout << "Trigger FlashLamp" << std::endl; 
    } 
}; 

class Spectrometer 
{ 
public: 
    IFlashLamp& mFlashLamp; 

    Spectrometer(IFlashlamp& flashLamp) : mFlashLamp(flashLamp) {} 
    void foo(){ 
     for(int i=0; i<5; i++){ 
      mFlashLamp.trigger(); 
     } 
    } 

}; 

をインターフェイスへの呼び出しに関する期待値:

class FlashLampMock : public IFlashlamp { 
    int triggerCallCounter; 
public: 
    FlashLampMock() : triggerCallCounter(0) {} 
    virtual void trigger() override { 
     ++triggerCallCounter; 
    } 
    int getTriggerCallCounter() const { return triggerCallCounter; } 
}; 

これは、ユニットテストです:

int main(){ 
    FlashLampMock flashLampMock; 
    Spectrometer S(FlashLampMock); 
    S.foo(); 
    assert(flashLampMock.getTriggerCallCounter() == 5); 
    return 0; 
} 
+0

例として完全なソリューションを提供していただきありがとうございます。私はFlashLampを渡すことを避けたかったのです。実際のシステムにはもっと多くのコンポーネントがあるので、私はこの方向には考えませんでした。 しかし、あなたのソリューションはとても良いので、私はすべてのコンポーネントを含む複合オブジェクトを作成し、これを渡す必要があると思います。 – Nikolai

関連する問題