使用 Gmock 测试简单函数 - 测试失败(应该通过?)

Testing simple function with Gmock - test fails(should pass?)

我刚开始使用 Gtest/Gmocks,我正在为一个例子苦苦挣扎。我有一个简单的 class,它有一个成员函数,returns 一个值(比如 3)。我正在尝试模拟此测试并检查返回的结果是否为 3。为简单起见,我将所有内容都写在一个文件中:

// Testing.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "gmock\gmock.h"
#include "gtest\gtest.h"
using ::testing::AtLeast;
using namespace std;

class MyClass{
public:
    virtual int retValue() { return 3; } 
    virtual ~MyClass(){}
};


class FakeMyClass : public MyClass
{
public:
    MOCK_METHOD0( retValue, int() );
};

TEST(TestForMyClass, TestRetVal)
{
    FakeMyClass obj3;
    EXPECT_EQ(obj3.retValue(), 3);
}

int _tmain(int argc, _TCHAR* argv[])
{
    ::testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

但是我的测试失败了,它说预期结果是 3 而我的实际结果是 0。 我看了几个例子,我想我做了所有的事情,结果仍然不是我所期望的。请帮我看看我哪里错了,我怎样才能让测试通过。谢谢。

您问题的简单答案是: 您有一个模拟对象 FakeMyClass。如果重写此方法,此对象将永远 return 基数 class 的值!!

如果要测试 class 的简单方法,则不需要 mock。只需测试您的 class:

class MyClass{
public:
  virtual int retValue() { return 3; } 
  virtual ~MyClass(){}
};

TEST(TestForMyClass, TestRetVal)
{
  MyClass obj3;
  EXPECT_EQ(obj3.retValue(), 3);
}

再多一点嘲笑:
测试的一个原则是隔离测试。所以,当你的 class 与另一个对象有关系时,你必须模拟这个对象。我建议看一个例子 (例如 klick)。
在此示例中,Painter 是被测系统。 Painter 与被嘲笑的 Turtle 通信。