微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 gtest 使用自定义键验证地图项?

如何解决如何使用 gtest 使用自定义键验证地图项?

我为我的地图编写了一个自定义

struct custom_key {
  string id;
  string sector;

  bool operator==(const custom_key& other) {
    // I'm needed by gtest
    return id == other.id && sector == other.sector;
  }

};

为此我添加了less then重载

namespace std
{
  template<> struct less<custom_key>
  {
    bool operator() (const custom_key& lhs,const custom_key& rhs) const
    {
      return lhs.id < rhs.id;
    }
  };
}

我也定义了我的匹配器

MATCHER_P(match_eq,value,"")
{
    return arg == value;
}

我试着写一个测试

EXPECT_CALL(
  *stats_,stats(
    AllOf(
      Field(&data,Contains(
          Pair(
            custom_key{"id","name"},match_eq("expected_value")
          )
        )
      )
   )
);

我已经运行过它

std::map<custom_key,std::string> my_map = { {"id","expected_value" }

并且 gtest 说他没有找到匹配项。我迷路了。 由于在 gtest 的 impl 中大量使用模板,我找不到调试它的任何帮助。 任何想法将不胜感激。

解决方法

我在这里看到的第一个问题是您的 operator== 没有 const 限定符。你需要这样的东西:

bool operator==(const custom_key& other) const {
    // I'm needed by gtest
    return id == other.id && sector == other.sector;
  }

下一个,

我已经针对 std::map my_map = { {"id","name"},"expected_value" }

这不会编译,你需要有额外的大括号来初始化 std::pair<custom_key,std::string> 之后将初始化 std::map

您没有解释您在 EXPECT_CALL 中执行的所有检查,但您似乎对使用 documentation 的容器验证有了大致了解。

std::map 验证的完整解决方案如下所示:

#include <map>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace ::testing;
using namespace std;

struct custom_key {
    string id;
    string sector;

    bool operator==(const custom_key& other) const
    {
        // I'm needed by gtest
        return id == other.id && sector == other.sector;
    }
};

namespace std {
template <>
struct less<custom_key> {
    bool operator()(const custom_key& lhs,const custom_key& rhs) const
    {
        return lhs.id < rhs.id;
    }
};
}

TEST(MapValidation,67704150)
{
    map<custom_key,string> my_map { { { "id","name" },"expected_value" } };
    EXPECT_THAT(my_map,Contains(Pair(custom_key { "id","expected_value")));
}

我也不明白你为什么需要匹配器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?