单元测试呼叫实例变量的函数

Unit test a call to function of instance variable

本文关键字:函数 变量 实例 呼叫 单元测试      更新时间:2023-10-16

我有一些C 代码,类似于下面给出的示例。我想编写一个单元测试,以验证mflashlamp.trigger恰好称为五次。但是,到目前为止,我无法找到一个很好的方法来做到这一点。

我有以下约束:遵守Misra/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:我真的试图提出一个很好的标题,但不能。如果有人有任何改进,请随时进行编辑。

单元测试中的惯用方式是使用 interfaces 模拟类::

#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;
}