Я новичок в 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;
}
В вашем коде есть две ошибки, означающие, что вам не хватает основ C ++.
Первая ошибка в вашем фиктивном классе. GetSize()
метод в базовом классе Foo
объявлен как:
virtual int GetSize(int size)
но в твоем издевательстве это так:
MOCK_CONST_METHOD1(GetSize, int(int size));
имея в виду
virtual int GetSize(int size) const
Эти два метода имеют разные сигнатуры, и поэтому MockFoo не переопределяет метод Foo.
Вторая ошибка — когда вы передаете объект 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;
};
Других решений пока нет …