如何验证传递给模拟函数的参数的派生类型

问题描述 投票:2回答:2

我有一个基类和两个派生类,就像这样:

class Base { ... };
class DerivedA : public Base { ... };
class DerivedB : public Base { ... };

我也有一个我正在模拟的接口类(使用Google Mock),如下所示:

class MockSomeInterface : public SomeInterface
{
  public:
    MOCK_METHOD1(someMethod, void(Base* basePtr));
};

我可以期望像这样对模拟方法的调用,根本不验证调用中的参数:

EXPECT_CALL(mockSomeInterfaceObj, someMethod(_))
  Times(2);

[我想做的是验证提供给someMethod的参数的类型,以检查它实际上是用DerivedA*调用一次,还是用DerivedB*调用,而不是用任何参数调用两次。

c++ unit-testing googletest gmock
2个回答
2
投票

您可以为此编写匹配器函数。您的期望将如下所示

{
  InSequence s;
  EXPECT_CALL(mockSomeInterfaceObj, someMethod(IsDerivedA()))
    Times(1);
  EXPECT_CALL(mockSomeInterfaceObj, someMethod(IsDerivedB()))
    Times(1);
}

如果已定义以下匹配器功能:

MATCHER(IsDerivedA, "")
{
  if (arg == NULL)
  {
    return false;
  }
  DerivedA* derived = dynamic_cast<DerivedA*>(arg);
  if (derived == NULL)
  {
    *result_listener << "is NOT a DerivedA*";
    return false;
  }
  return true;
}

MATCHER(IsDerivedB, "")
{
  if (arg == NULL)
  {
    return false;
  }
  DerivedB* derived = dynamic_cast<DerivedB*>(arg);
  if (derived == NULL)
  {
    *result_listener << "is NOT a DerivedB*";
    return false;
  }
  return true;
}

尽管请注意,如果它不是指针参数而是引用,则在类型不匹配(dynamic_cast)的情况下,std::bad_cast将抛出NULL而不是返回http://en.cppreference.com/w/cpp/language/dynamic_cast


1
投票

gMock提供了一个指针匹配器,可用于将基类指针与派生类对象参数进行匹配。 (https://github.com/google/googletest/blob/master/googlemock/docs/cheat_sheet.md#pointer-matchers

using ::testing::NotNull;
using ::testing::WhenDynamicCastTo;

EXPECT_CALL(mockSomeInterfaceObj, someMethod(WhenDynamicCastTo<DerivedA*>(NotNull()))).Times(1);
EXPECT_CALL(mockSomeInterfaceObj, someMethod(WhenDynamicCastTo<DerivedB*>(NotNull()))).Times(1);
© www.soinside.com 2019 - 2024. All rights reserved.