GoogleTest之Matchers的用法

目录

  • 组合匹配
  • Matcher的类型转换
  • 重载函数的匹配
  • 基于参数执行不同的Actions
  • 多个参数作为一个整体匹配
  • 将Matchers作为谓词使用
  • Matcher汇总

组合匹配

组合某些匹配某些值,可以使用以下:

Matcher 使用描述
AllOf(m1, m2, …, mn) 参数必须匹配m1, … mn
AllOfArray({m0, m1, …, mn}) / AllOfArray(a_container) / AllOfArray(begin, end) / AllOfArray(array) / AllOfArray(array, count) 必须要和从初始化列表/STL容器/迭代器/可迭代的数组/C风格数组给定的参数匹配
AnyOf(m1, m2, …, mn) 匹配m1到mn中任意的,至少一个
AnyOfArray({m0, m1, …, mn}) / AnyOfArray(a_container) / AnyOfArray(begin, end) / AnyOfArray(array) / AnyOfArray(array, count) 用法同上,匹配任意一个就可以
Not(m) 不匹配m就可以
Conditional(cond, m1, m2) 如果cond为true则匹配m1,否则匹配m2

示例:

using ::testing::AllOf;
using ::testing::Gt;
using ::testing::HasSubstr;
using ::testing::Ne;
using ::testing::Not;
...
  // The argument must be > 5 and != 10.
  EXPECT_CALL(foo, DoThis(AllOf(Gt(5),Ne(10))));

  // The first argument must not contain sub-string "blah".
  EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")),NULL));

Matcher的类型转换

  • TODO gMock提供函数 SafeMatcherCast(m) 能够将m转换为Matcher

重载函数的匹配

  1. 通过Const()区分重载的const和非const函数
using ::testing::ReturnRef;

class MockFoo : public Foo {
  ...
  MOCK_METHOD(Bar&, GetBar, (), (override));
  MOCK_METHOD(const Bar&, GetBar, (), (const, override));
};
...
  MockFoo foo;
  Bar bar1, bar2;
  EXPECT_CALL(foo, GetBar()).WillOnce(ReturnRef(bar1));        // The non-const GetBar().
      
  EXPECT_CALL(Const(foo), GetBar()).WillOnce(ReturnRef(bar2));  // The const GetBar().
  // 对foo的调用都使用:Const(foo), 如:
  EXPECT_EQ(Const(foo).GetBar(), bar2);
  1. 区分相同参数个数但不同参数类型,需要指定准确类型。
    第一种方式是使用Matcher() TODO 
    第二种方法:使用TypedEq, An()
using ::testing::An;
using ::testing::Matcher;
using ::testing::TypedEq;

class MockPrinter : public Printer {
 public:
  MOCK_METHOD(void, Print, (int n), (override));
  MOCK_METHOD(void, Print, (char c), (override));
};

TEST(PrinterTest, Print) {
  MockPrinter printer;

  EXPECT_CALL(printer, Print(An<int>()));            // void Print(int);
  EXPECT_CALL(printer, Print(Matcher<int>(Lt(5))));  // void Print(int);
  EXPECT_CALL(printer, Print(TypedEq<char>('a')));   // void Print(char);

  printer.Print(3);
  printer.Print(6);
  printer.Print('a');
}

基于参数执行不同的Actions

可以通过不同期望指定不同参数的Actions
示例代码:

TEST(test_matcher, mock_matcher01) {
  MockMatchFoo foo;
  EXPECT_CALL(foo, DoThis(_)).WillRepeatedly(Return(10));
  EXPECT_CALL(foo, DoThis(Lt(5))).WillRepeatedly(Return(20));

  EXPECT_EQ(foo.DoThis(2), 21);  // 参数值<5,会执行返回20的Action
  EXPECT_EQ(foo.DoThis(6), 12);  // 参数值>5,会调用参数为"_"的Acton
}

输出:
GoogleTest之Matchers的用法_第1张图片

多个参数作为一个整体匹配

EXPECT_CALL的With方法可以让我们将所有参数作为一个整体来匹配。With的参数必须是Matcher>(A1, … An是函数参数)

EXPECT_CALL(foo, InRange(Ne(0), _)).With(Lt());  // 第一个参数必须小于第二个参数,等价于:
EXPECT_CALL(foo, InRange(Ne(0), _)).With(AllArgs(Lt()));  // 但是这样更具有可读性

可以使用 Args(m) 匹配n个参数

EXPECT_CALL(foo, Blah).With(AllOf(Args<0, 1>(Lt()), Args<1, 2>(Lt()))); // 第0个小于第1个,第1个小于第2个

gMock将n个参数作为一个std::tuple类型,所以如果是谓词的话需要声明成std::tuple类型。

将Matchers作为谓词使用

Matcher Description
Matches(m)(value)
ExplainMatchResult(m, value, result_listener)
Value(value, m) 如果value和m匹配则为true

Matcher汇总

Matcher Description
_ 可以是正确类型的任意值
A()An() 类型type的任意值

你可能感兴趣的:(GoogleTest,c++,单元测试,集成测试,模块测试,功能测试)