GoogleTest Ожидать сбой вызова для фиктивного метода

Я новичок в GTEST, просто понимаю, как работает макет,

я попытался написать простую программу Foo.h и FooDisplay.h (которая требует Foo в конструкторе), а также MockFoo.cpp (которая является основной программой GTEST для тестирования Gmock) ..

когда я высмеиваю и выполняю вызов Expect для Foo, он запускается ниже при выполнении ..

бревна

[==========] 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;
}

3

Решение

В вашем коде есть две ошибки, означающие, что вам не хватает основ 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;
    };
    
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]