如何使用 gmock 创建模板化自定义匹配器

问题描述 投票:0回答:1

我想使用来自:

https://google.github.io/googletest/reference/matchers.html#pointer-matchers
WhenDynamicCastTo<T>(m)

但是我想要动态转换的是

shared_ptr
并且
WhenDynamicCastTo
不适用于智能指针。

我尝试制作自己的与智能指针一起使用的版本,但我不确定如何制作模板化匹配器,我尝试了这个,但它不起作用:

template <typename To>
MATCHER_P(WhenDynamicPointerCastTo<To>, matcher, "")
{
    // Use std::dynamic_pointer_cast here
}

这样做确实有效,但我想将其隐藏在单个匹配器后面:


template <typename To>
std::shared_ptr<const To> dynamic_smart_pointer_cast(
    const std::shared_ptr<const parent>& p)
{
    return std::dynamic_pointer_cast<const To>(p);
}

EXPECT_CALL(*mock_, func(
    ::testing::ResultOf(
        dynamic_smart_pointer_cast<child>,
        ::testing::Pointee(...))));
c++ unit-testing testing googlemock
1个回答
0
投票

以下内容基于

WhenDynamicCastTo
在 gmock 源代码中的工作方式(未经测试),一些结果打印已被删除,因为它使用 gmock 的
internal
命名空间中的帮助程序。

template <typename To>
class WhenDynamicPointerCastToMatcher {
 public:
  explicit WhenDynamicPointerCastToMatcher(const Matcher<To>& matcher)
      : matcher_(matcher) {}

  void DescribeTo(::std::ostream* os) const {
    GetCastTypeDescription(os);
    matcher_.DescribeTo(os);
  }

  void DescribeNegationTo(::std::ostream* os) const {
    GetCastTypeDescription(os);
    matcher_.DescribeNegationTo(os);
  }

  template <typename From>
  bool MatchAndExplain(From from, MatchResultListener* listener) const {
    To to = std::dynamic_pointer_cast<To>(from);

    // TODO: describe failures to the listener
    return matcher_.Matches(to);
  }

 private:
  static void GetCastTypeDescription(::std::ostream* os) {
    *os << "when dynamic_pointer_cast, ";
  }

  const Matcher<To> matcher_;
};

template <typename To>
inline PolymorphicMatcher<WhenDynamicPointerCastToMatcher<To>>
WhenDynamicPointerCastTo(const Matcher<To>& inner_matcher) {
  return MakePolymorphicMatcher(
      WhenDynamicPointerCastToMatcher<To>(inner_matcher));
}
© www.soinside.com 2019 - 2024. All rights reserved.