Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ 为什么GoogleMock模仿的原始方法仍然被调用?_C++_Unit Testing_Googletest_Googlemock - Fatal编程技术网

C++ 为什么GoogleMock模仿的原始方法仍然被调用?

C++ 为什么GoogleMock模仿的原始方法仍然被调用?,c++,unit-testing,googletest,googlemock,C++,Unit Testing,Googletest,Googlemock,我一直在尝试使用GoogleMock覆盖底层类中的一些特定方法,但是我似乎得到的是基本构造函数,而不是模拟对象。这里有什么明显的我遗漏的吗 我一直遵循以下示例: 然而,在我的测试中,我仍然得到我的“printf”调用。有什么想法吗 以下是类/头文件: A.h: A.cpp: B.h: B.cpp: MockA.h: BTest.cpp: #include "gtest/gtest.h" #include "MockA.h" #include "B.h" using ::testing::At

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

我一直遵循以下示例:

然而,在我的测试中,我仍然得到我的“printf”调用。有什么想法吗

以下是类/头文件:

A.h:

A.cpp:

B.h:

B.cpp:

MockA.h:

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

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


成员
B::mA
必须是多态性工作的参考或指针。

@Someprogrammerdude重新发布了问题,删除了原始问题,并在此处使用了精确的代码。。。如果您有任何见解,他们将不胜感激@doctorlove从上一个问题重新发布请不要删除并重新发布同一个问题。改为编辑现有问题。这也会把这个问题再次推到头版。所以。。。当我沿着引用/指针的道路走下去时,如果没有使用该方法,情况就好了。。。但是当我尝试使用“EXPECT”调用时,它最终得到了奇怪的堆栈错误(特别是堆栈指针周围的错误没有正确匹配)。有没有更好的方法来实现这一点,使用谷歌模拟?
#include "A.h"

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

void A::someConcreteMethod()
{
}
#include "A.h"

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

private:
    A mA;
};
#include "B.h"

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

B::~B(){}

void B::MethodToTest()
{
    mA.methodToOverride();
}
#include "A.h"
#include "gmock\gmock.h"

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

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