【问题标题】:Testing simple function with Gmock - test fails(should pass?)使用 Gmock 测试简单功能 - 测试失败(应该通过?)
【发布时间】:2017-08-28 16:51:41
【问题描述】:

我刚开始使用 Gtest/Gmocks,我正在努力研究一个示例。我有一个简单的类,它有一个成员一个返回值的函数(比如 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。 我看过几个例子,我认为我做了所有事情,但结果不是我所期望的。请帮助我看看我错在哪里以及如何使该测试通过。谢谢。

【问题讨论】:

    标签: googletest gmock


    【解决方案1】:

    您的问题的简单答案是: 您有一个模拟对象FakeMyClass。如果你重写了这个方法,这个对象永远不会返回基类的值!!

    如果你想测试一个类的简单方法,你不需要mock。只需测试您的课程:

    class MyClass{
    public:
      virtual int retValue() { return 3; } 
      virtual ~MyClass(){}
    };
    
    TEST(TestForMyClass, TestRetVal)
    {
      MyClass obj3;
      EXPECT_EQ(obj3.retValue(), 3);
    }
    

    再嘲讽一点:
    测试的一个原则是孤立地测试。因此,当您的类与另一个对象相关时,您必须模拟该对象。我建议看一个例子 (例如klick)。
    在此示例中,Painter 是被测系统。 PainterTurtle 通信,这是被嘲笑的。

    【讨论】:

    • 你好 Soeren 谢谢你的回答。我知道在我的情况下我不需要做那个模拟,这只是为了学习目的。我知道我可以简单地测试类的方法,但我想学习理解模拟的原理。
    • 你好 Soeren 谢谢你的回答。我知道在我的情况下我不需要做那个模拟,这只是为了学习目的。我知道我可以简单地测试类的方法,但我想学习理解模拟的原理。你能解释一下我如何使用一种解决方法,以便我可以测试 returnValue 函数确实使用模拟返回 3 吗?
    • 不,这不是嘲讽的目的。此外,您的问题是:为什么我的实际结果不是 3。我给出了该问题的答案。我建议您更深入地了解模拟和测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多