Прежде всего:
bobj.METHOD0();
совершенно неправильно. METHOD0
не является допустимым символом для доступа к имитируемой функции.
Вы хотите проверить, что B::BMethod1()
вызывает A::Show()
, верно?
Измените эту строку на
bobj.BMethod1();
Вы можете изменить класс B
, чтобы использовать его реализацию базового класса в качестве параметра шаблона:
class A
{
public:
virtual void Show(){}
// ^^^^^^^ See note 1
};
template<class Base>
class B : public Base
public:
void BMethod1(){Show()}
};
Затем вы используете
B<A> bobj;
bobj.BMethod1();
в вашем производственном коде и
B<MockA> bobj;
EXPECT_CALL(bobj , Show());
bobj.BMethod1(); // <<< trigger the expectation
в коде вашего модульного теста.
В качестве бокового узла:
Это хорошо известный шаблон для внедрения базовых классов через параметры типа шаблона, называемые Mixin em>.
Хотя Mixins в основном предназначены для предоставления кусочных реализаций интерфейсов, которые в основном предназначены для составления общедоступных реализаций интерфейса.
Однако попадание в такой случай при попытке модульного тестирования класса в отношении этих манер автоматически привело бы меня к вопросу, есть ли у меня недостаток дизайна:
Является ли B
действительно A
или он скорее предназначен для использования экземпляра A
в качестве переменной-члена, находящейся в собственности или на которую ссылаются?
Если мне понадобится проверить это в модульном тесте, я бы подумал о рефакторинге класса B
во что-то вроде
class B {
A& a_;
public:
B(A& a) a_(a) {}
void BMethod1() { a_.Show(); }
};
И соответствующим образом адаптируйте тестовые сценарии:
TEST(BTEST , ShowMethod)
{
MockA aobj;
B bobj(aobj);
EXPECT_CALL(aobj , Show());
bobj.BMethod1();
}
Что касается вашего комментария
Цель состоит в том, чтобы тестовый пример мог возвращать имитированные значения - EXPECT_CALL(mMockA, show()) .WillOnce(Return(false));
Это должно работать с примером выше:
EXPECT_CALL(bobj, Show()) .WillOnce(Return(false));
Но требует, чтобы Show()
было объявлено как
virtual bool Show();
в классе A
и т.п.
MOCK_METHOD0(Show, bool());
в MockA
классе.
1)Объявление virtual
необходимо, чтобы позволить MockA
переопределить исходную реализацию.
person
user0042
schedule
02.12.2017
class B
? - person user0042   schedule 02.12.2017