【问题标题】:How to verify the derived type of a parameter passed to a mocked function如何验证传递给模拟函数的参数的派生类型
【发布时间】:2015-10-30 12:23:41
【问题描述】:

我有一个基类和两个派生类,如下所示:

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


    【解决方案1】:

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

    {
      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)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 2013-02-02
        • 1970-01-01
        • 2015-08-20
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        相关资源
        最近更新 更多