C++ 模拟方法的GoogleTest Expect调用失败
我是GTEST新手,只是了解模拟的工作原理 我试着编写简单的程序Foo.h和FooDisplay.h(它需要构造函数中的Foo),还有MockFoo.cpp(它是测试Gmock的主要GTEST程序) 当我对Foo进行mock并执行Expect调用时,它会在执行中抛出下面的内容 日志 Foo.hC++ 模拟方法的GoogleTest Expect调用失败,c++,unit-testing,mocking,googletest,googlemock,C++,Unit Testing,Mocking,Googletest,Googlemock,我是GTEST新手,只是了解模拟的工作原理 我试着编写简单的程序Foo.h和FooDisplay.h(它需要构造函数中的Foo),还有MockFoo.cpp(它是测试Gmock的主要GTEST程序) 当我对Foo进行mock并执行Expect调用时,它会在执行中抛出下面的内容 日志 Foo.h #include <gtest/gtest.h> #include <infra/utility/core/lang/PPException.h> #include <inf
#include <gtest/gtest.h>
#include <infra/utility/core/lang/PPException.h>
#include <infra/utility/core/lang/String.h>
#include <iostream>
class Foo {
public:
virtual ~Foo()
{ }
virtual int GetSize(int size)
{
return size;
}
};
#include <gtest/gtest.h>
#include <infra/utility/core/lang/PPException.h>
#include <infra/utility/core/lang/String.h>
#include <iostream>
#include "Foo.h"
class FooDisplay {
public:
FooDisplay ( Foo _foo) : foo(_foo)
{ }
virtual ~FooDisplay()
{ }
virtual String Describe(int size)
{
foo.GetSize(size);
String str = "Done";
return str;
}
private:
Foo foo;
};
#包括
#包括
#包括
#包括
福班{
公众:
虚拟~Foo()
{ }
虚拟整数GetSize(整数大小)
{
返回大小;
}
};
FooDisplay.h
#include <gtest/gtest.h>
#include <infra/utility/core/lang/PPException.h>
#include <infra/utility/core/lang/String.h>
#include <iostream>
class Foo {
public:
virtual ~Foo()
{ }
virtual int GetSize(int size)
{
return size;
}
};
#include <gtest/gtest.h>
#include <infra/utility/core/lang/PPException.h>
#include <infra/utility/core/lang/String.h>
#include <iostream>
#include "Foo.h"
class FooDisplay {
public:
FooDisplay ( Foo _foo) : foo(_foo)
{ }
virtual ~FooDisplay()
{ }
virtual String Describe(int size)
{
foo.GetSize(size);
String str = "Done";
return str;
}
private:
Foo foo;
};
#包括
#包括
#包括
#包括
#包括“Foo.h”
类显示{
公众:
FooDisplay(Foo\u Foo):Foo(\u Foo)
{ }
虚拟显示
{ }
虚拟字符串描述(整数大小)
{
foo.GetSize(size);
String str=“完成”;
返回str;
}
私人:
富富,;
};
MooFoo.cpp
#include "gmock/gmock.h"
#include <infra/utility/core/lang/String.h>
#include <iostream>
#include "FooDisplay.h"
using ::testing::Return;
using ::testing::_;
class MockFoo : public Foo {
public:
MOCK_CONST_METHOD1(GetSize, int(int size));
//MOCK_CONST_METHOD1(Describe, String(int));
};
TEST(Foo,case1)
{
MockFoo mockfoo;
FooDisplay Display(mockfoo);
EXPECT_CALL(mockfoo,GetSize(_)).WillOnce(Return(6));
Display.Describe(5);
// ON_CALL(Display,Describe(5)).WillByDefault( Return ("Hi"));
}
int main(int argc, char * argv[])
{
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
//return 1;
}
#包括“gmock/gmock.h”
#包括
#包括
#包括“FooDisplay.h”
使用::测试::返回;
使用::测试::;
MockFoo类:公共Foo{
公众:
MOCK_CONST_METHOD1(GetSize,int(int size));
//模拟常量方法1(描述,字符串(int));
};
测试(Foo,案例1)
{
MockFoo MockFoo;
FooDisplay(mockfoo);
EXPECT_调用(mockfoo,GetSize()).WillOnce(Return(6));
显示。描述(5);
//通话时(显示,描述(5))。默认情况下(返回(“Hi”));
}
int main(int argc,char*argv[])
{
::测试::InitGoogleTest(&argc,argv);
返回运行所有测试();
//返回1;
}
代码中有两个错误,这意味着你缺少C++基础知识。
第一个bug出现在模拟类中。基类Foo
中的GetSize()
方法声明为:
虚拟整数GetSize(整数大小)
但在你的模拟中是:
MOCK_CONST_METHOD1(GetSize,int(int size))代码>
意思
虚拟整数GetSize(整数大小)常量
这两个方法具有不同的签名,因此,MockFoo不会重写Foo的方法
第二个错误是将MockFoo的对象传递给DisplayFoo的构造函数。我认为您想要做的是使用MockFoo对象,但您不小心复制了它的基本对象。将FooDisplay更改为此应该可以解决此问题:
class FooDisplay {
public:
FooDisplay (Foo & _foo) : foo (_foo) { }
virtual ~FooDisplay () { }
virtual std::string Describe (int size) {
foo.GetSize (size);
std::string str = "Done";
return str;
}
private:
Foo & foo;
};