单元测试对实例变量函数的调用
Unit test a call to function of instance variable
我有一些类似于下面给出的示例的 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和Mock 类:
#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 来实现接口,这样您就可以检查对接口调用的预期:
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;
}
我有一些类似于下面给出的示例的 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和Mock 类:
#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 来实现接口,这样您就可以检查对接口调用的预期:
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;
}