3

我是 GTEST 的新手,只是了解 Mock 的工作原理,

我尝试编写简单的程序 Foo.h 和 FooDisplay.h (它需要在构造函数中的 Foo ),还有 MockFoo.cpp (这是测试 Gmock 的主要 GTEST 程序)..

当我模拟并为 Foo 执行 Expect 调用时,它会在执行中抛出以下内容..

日志

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Foo
[ RUN      ] Foo.case1
package/web/webscr/MockFoo.cpp:19: Failure
Actual function call count doesn't match EXPECT_CALL(mock, GetSize(_))...
         Expected: to be called once
           Actual: never called - unsatisfied and active
[  FAILED  ] Foo.case1 (0 ms)
[----------] 1 test from Foo (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] Foo.case1

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

};

FooDisplay.h

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

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

1 回答 1

4

您的代码中有两个错误,这意味着您缺乏 c++ 基础知识。

  1. 第一个错误在您的模拟课程中。GetSize()基类中的方法Foo声明为 :
    virtual int GetSize(int size)
    但在您的模拟中它是 :
    MOCK_CONST_METHOD1(GetSize, int(int size));
    意思
    virtual int GetSize(int size) const
    这两种方法具有不同的签名,因此,MockFoo 不会覆盖 Foo 的方法。

  2. 第二个错误是当您将 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;
    };
    
于 2013-03-20T08:00:28.807 回答