【问题标题】:Why is original method mocked by GoogleMock still getting called?为什么 GoogleMock 模拟的原始方法仍然被调用?
【发布时间】:2023-04-02 13:15:01
【问题描述】:

我一直在尝试使用 GoogleMock 来覆盖底层类中的一些特定方法,但是我似乎得到的是基本构造函数,而不是模拟对象。我在这里有什么明显的遗漏吗?

我一直在关注以下示例: http://blog.divebomb.org/2011/07/my-first-c-cmake-googletest-and-googlemock/

但是,在我的测试中,我的“printf”仍然被调用。有什么想法吗?

这里是类/头文件:

啊.h

#pragma once
class A
{
public:
    virtual void methodToOverride();
    void someConcreteMethod();

    int mMemberVariable;
};

A.cpp

#include "A.h"

void A::methodToOverride()
{
    std::printf("Hello World");
}

void A::someConcreteMethod()
{
}

B.h

#include "A.h"

class B
{
public:
    B(A &injectedClass);
    ~B();
    void MethodToTest();

private:
    A mA;
};

B.cpp

#include "B.h"

B::B(A & injectedClass):mA(injectedClass)
{
    mA.someConcreteMethod();
}

B::~B(){}

void B::MethodToTest()
{
    mA.methodToOverride();
}

MockA.h

#include "A.h"
#include "gmock\gmock.h"

class MockA : public A
{
public:
    MOCK_METHOD0(methodToOverride, void());

};

BTest.cpp:

#include "gtest/gtest.h"
#include "MockA.h"
#include "B.h"

using ::testing::AtLeast;
using ::testing::_;

TEST(BTest, mockObject)
{
    // Arrange
    MockA injectedMock;
    EXPECT_CALL(injectedMock, methodToOverride())
        .Times(AtLeast(1));

    B classUnderTest(injectedMock);

    // Act
    classUnderTest.MethodToTest();
}

【问题讨论】:

  • @Someprogrammerdude 重新发布了问题,删除了原始问题,并在此处提供了确切的代码...如果您有任何见解,我们将不胜感激!
  • @doctorlove 转自上一个问题
  • 请不要删除和转发相同的问题。改为编辑现有问题。这也会将问题再次推回首页。

标签: c++ unit-testing googletest googlemock


【解决方案1】:

一个主要问题是B::mAA 类的实例。它对子类和对象一无所知。

成员B::mA 需要是引用或指针,多态才能起作用。

【讨论】:

  • 所以...当我沿着参考/指针的道路前进时,不使用该方法时很好...但是当我尝试使用“EXPECT”调用时,它结束了得到奇怪的堆栈错误(特别是堆栈指针周围的错误不正确匹配)。使用 Google Mock 是否有更好的方法来完成此任务?
猜你喜欢
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多