在使用Google Test框架进行单元测试时,有时需要为重载的方法指定一个匹配器(Matcher)来验证参数的类型或值。Google Test提供了::testing::AnyOf
、::testing::AllOf
等匹配器,以及::testing::Matcher
模板类来创建自定义匹配器。但是,对于重载的方法,直接指定匹配器可能会遇到类型歧义的问题。
为了解决这个问题,可以使用::testing::Matcher
模板类结合::testing::_
(通配符)来指定匹配器的参数类型。下面是一个示例代码,展示了如何为重载的方法指定内部::testing::AnythingMatcher
的参数类型:
#include <gtest/gtest.h>
#include <gmock/gmock.h>
class MyClass {
public:
virtual void foo(int x) = 0;
virtual void foo(double x) = 0;
};
class MockMyClass : public MyClass {
public:
MOCK_METHOD(void, foo, (int x), (override));
MOCK_METHOD(void, foo, (double x), (override));
};
TEST(MyClassTest, TestFooInt) {
MockMyClass mock;
EXPECT_CALL(mock, foo(::testing::_)).Times(1); // 这里会报类型歧义错误
// 解决方法:明确指定参数类型
EXPECT_CALL(mock, foo(::testing::Matcher<int>(::testing::_))).Times(1);
mock.foo(42);
}
TEST(MyClassTest, TestFooDouble) {
MockMyClass mock;
EXPECT_CALL(mock, foo(::testing::_)).Times(1); // 这里会报类型歧义错误
// 解决方法:明确指定参数类型
EXPECT_CALL(mock, foo(::testing::Matcher<double>(::testing::_))).Times(1);
mock.foo(3.14);
}
在这个示例中,MyClass
类有两个重载的foo
方法,分别接受int
和double
类型的参数。在测试中,我们使用MockMyClass
来模拟MyClass
的行为。
当使用EXPECT_CALL
宏来设置期望时,如果不明确指定参数类型,编译器会因为类型歧义而报错。为了解决这个问题,我们可以使用::testing::Matcher<T>
模板类来明确指定参数类型,其中T
是我们希望匹配的参数类型。在这个例子中,我们分别使用::testing::Matcher<int>
和::testing::Matcher<double>
来指定foo
方法的参数类型。
通过这种方式,我们可以为重载的方法指定内部::testing::AnythingMatcher
的参数类型,从而避免类型歧义的问题。
领取专属 10元无门槛券
手把手带您无忧上云