如何匹配输入参数的联合元素的值,例如,如果我模拟具有以下意义的方法-
struct SomeStruct
{
int data1;
int data2;
};
void SomeMethod(SomeStruct data);如何匹配调用此方法的模拟,并在参数中使用正确的值?
发布于 2014-06-03 11:45:16
在详细阅读了Google模拟文档之后,我解决了定义匹配部分中记录的问题。(举个例子就太好了!)
因此,解决方案是使用MATCHER_P宏来定义自定义匹配器。因此,对于匹配的SomeStruct.data1,我定义了一个匹配器:
MATCHER_P(data1AreEqual, ,"") { return (arg.data1 == SomeStructToCompare.data1); }为了匹配它,我使用了这样的自定义宏:
EXPECT_CALL(someMock, SomeMethod(data1AreEqual(expectedSomeStruct)));在这里,expectedSomeStruct是我们期望的structure.data1的值。
注意,正如在其他答案中所建议的那样(在本文和其他文章中),它要求被测试的单元进行更改以使其可测试。那不应该是必要的!例如超载。
发布于 2016-12-05 12:42:37
如果需要显式测试结构中的一个字段(或类的一个“属性”)的特定值,则使用" field“和"property”定义来测试这一点。有结构的:
EXPECT_CALL( someMock, SomeMethod( Field( &SomeStruct::data1, expectedValue )));或者,如果我们有SomeClass (SomeStruct的整数),那么它具有私有成员变量和公共getter函数:
EXPECT_CALL( someMock, SomeMethod( Property( &SomeClass::getData1, expectedValue )));发布于 2014-05-29 21:07:21
Google提供了一些关于使用gmock的很好的文档,包含了大量的示例代码。我强烈建议你检查一下:
正如您所指出的,默认的等式运算符(==)不是为类类型(包括荚)自动创建的。由于此运算符在匹配参数时由gmock使用,因此您需要显式地定义它,以便像使用任何其他类型一样使用该类型(如下所示):
// Assumes `SomeMethod` is mocked in `MockedObject`
MockedObject foo;
SomeStruct expectedValue { 1, 2 };
EXPECT_CALL(foo, SomeMethod(expectedValue));因此,处理这个问题最简单的方法是为结构定义一个相等操作符:
struct SomeStruct
{
int data1;
int data2;
bool operator==(const SomeStruct& rhs) const
{
return data1 == rhs.data1
&& data2 == rhs.data2;
}
};如果您不想走这条路,可以考虑使用场匹配来根据其成员变量的值匹配参数。(但是,如果测试想要比较结构实例之间的相等性,这就很好地表明了其他代码也会感兴趣。因此,仅仅定义一个operator==并完成它可能是值得的。)
https://stackoverflow.com/questions/23938233
复制相似问题