Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模拟方法的GoogleTest Expect调用失败_C++_Unit Testing_Mocking_Googletest_Googlemock - Fatal编程技术网

C++ 模拟方法的GoogleTest Expect调用失败

C++ 模拟方法的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

我是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 <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;
    };