- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在进行一些测试,以便重构一个旧的 C++ 项目。我正在尝试使用 gmock 匹配器 ElementsAreArray() 来匹配两个数组。
EXPECT_THAT(value_instance.value, ::testing::ElementsAreArray(var_array));
其中 value_instance.value 是指向 C 数组的指针。
但是,当我在测试中使用这行代码进行编译时,我从 gmock-matchers.h 文件中得到以下错误输出:
Error 1 error C2510: 'type' : left of '::' must be a class/struct/union s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2535 1 Project_Tests
Error 2 error C2146: syntax error : missing ';' before identifier 'Element' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2536 1 Project_Tests
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2536 1 Project_Tests
Error 4 error C2065: 'Element' : undeclared identifier s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2536 1 Project_Tests
Error 5 error C2825: 'testing::internal::ElementsAreMatcherImpl<Container>::StlContainer': must be a class or namespace when followed by '::' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 6 error C2039: 'value_type' : is not a member of '`global namespace'' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 7 error C2146: syntax error : missing ';' before identifier 'Element' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 8 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2399 1 Project_Tests
Error 9 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 10 error C2146: syntax error : missing ',' before identifier 'Element' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 11 error C2065: 'Element' : undeclared identifier s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 12 error C2059: syntax error : '>' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2502 1 Project_Tests
Error 13 error C2143: syntax error : missing ';' before '}' s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2506 1 Project_Tests
Error 14 error C1004: unexpected end-of-file found s:\repo_file\gmock-1.6.0\include\gmock\gmock-matchers.h 2506 1 Project_Tests
我可能遗漏了一些非常愚蠢的东西,但我似乎找不到问题所在。
#include <cstring>
#include "gtest/gtest.h"
#include "gmock/gmock.h"
//This is a stripped down version of The Class under test
enum {
VAL_TYPE_UNKNOWN, VAL_TYPE_INT, VAL_TYPE_BOOL, VAL_TYPE_ARRAY
};
class ClassUnderTest
{
public:
int alloc_len;
int len;
int type;
long i_value;
unsigned char *value;
ClassUnderTest (void)
{
alloc_len = 0;
len = 0;
value = 0;
i_value = 0;
type = VAL_TYPE_INT;
}
~ClassUnderTest (void)
{
if (value)
{
delete [] value;
value = 0;
}
}
void Init (void *val, int v_len)
{
NewLength(v_len);
if (val)
memcpy(value, val, v_len);
type = VAL_TYPE_ARRAY;
}
void NewLength (int new_len)
{
unsigned char *old;
if ((new_len > alloc_len) || (new_len == 0))
{
old = value;
value = 0;
if (new_len > 0)
{
value = new unsigned char [new_len];
memset(value, 0, new_len);
}
alloc_len = new_len;
if (old)
{
if (value)
memcpy(value, old, len);
delete [] old;
}
}
else if (new_len > len)
memset(value+len, 0, new_len-len);
len = new_len;
}
}
//this fails with the error list above
TEST(ClassUnderTestTests, TestInit)
{
ClassUnderTest value_instance;
unsigned char var_array[] = {1, 2, 3, 4, 5};
value_instance.Init((void *)var_array, sizeof(var_array));
EXPECT_EQ(value_instance.len, sizeof(var_array));
EXPECT_EQ(value_instance.i_value, 0);
EXPECT_EQ(value_instance.type, VAL_TYPE_ARRAY);
EXPECT_THAT(value_instance.value, testing::ElementsAreArray(var_array));
}
//This example works However the code above does not
TEST(ClassUnderTestTests, ElementsAreArrayFailure)
{
int array1[] = {1, 2, 3, 4, 5};
int array2[] = {1, 2, 3, 4, 5};
EXPECT_THAT(array1, testing::ElementsAreArray(array2));
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
最佳答案
您需要取消引用指向 C 数组的指针。
EXPECT_THAT(*value_instance.value, ::testing::ElementsAreArray(var_array));
// ^--- dereference the C-array
好的,现在看过你的代码,我会说 value_instance.value
是一个动态分配的数组而不是指向 C 数组的指针(参见 Arrays and Pointers 上的 comp.lang.c FAQ ).
所以简单的解决方法是交换 EXPECT_THAT(value, matcher)
宏中的参数。在这种情况下,该值不能只是一个指针,您需要给它一个类似于 std::
的容器(例如 C 数组)。但是,ElementsAreArray
函数可以处理被传递的动态分配数组,假设您还向它传递了数组的大小(因为无法推断)。
EXPECT_THAT(var_array,
testing::ElementsAreArray(value_instance.value, value_instance.len));
与其将参数的顺序交换到 EXPECT_THAT
,您还可以从 value_instance.value
构造一个临时的 vector
并将其作为值:
std::vector<unsigned char> value_copy(value_instance.value,
value_instance.value + value_instance.len);
EXPECT_THAT(value_copy, testing::ElementsAreArray(var_array));
关于c++ - gmock ElementsAreArray() Matcher 在 gmock-matchers.h 中给出编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16467037/
尝试使用 spacy matcher 时出现错误: ~\Anaconda3\lib\site-packages\spacy\matcher\matcher.pyx in spacy.matcher.m
我想检查一个字符串是否包含另一个字符串,忽略大小写。基本上,我想这样做: assertThat(dialogTitle.getText(), containsString(equalToIgnorin
我想断言 ICollection 包含满足约束集合的项目。对于 Java Hamcrest,我会使用 Matchers.containsInAnyOrder(Matcher... matchers)。
如果我有一个 Matcher[A],如何创建一个只有当 Iterable 的每个元素都满足原始 Matcher 时才满足的 Matcher[Iterable[A]]。 class ExampleSpe
这将是一个简单的问题,但如果我的类路径中包含两个库,我找不到它们之间的区别以及使用哪一个? 最佳答案 Hamcrest 匹配器方法返回 Matcher和 Mockito 匹配器返回 T。因此,例如:o
给定一个序列 Seq[Matcher[A]]我要索取单Matcher[A]当序列中的所有匹配器都成功时,它就成功了。 编辑 我自己提供的答案似乎有点笨拙,此外,如果该序列的所有失败匹配器都产生结果,那
我看到了这个post 关于两者的区别: Matchers.hasItem(..) Assert.assertThat(items, Matchers.hasItem(Matchers.hasToStr
我对以下之间的区别有点困惑: Matcher m; m.group(); 和 Matcher m; m.pattern().pattern(); 它们都从列表中返回正确的匹配项,但我不明白两者之间的区
我正在使用 while(matcher.find()) 循环访问文件并从中检索内容。我想知道如果我知道我找到的内容的索引位于 matcher.start() 中,我将如何从这个循环中获取行号。 我很困
我试过这个例子,只是交换了两条线,它给出了不同的输出,为什么 String inputString = "username@gmail.com"; String pattern="([a-z]+@)(
以下代码在首次运行时给出异常。但是当我在匹配器行上设置断点并在 Netbeans Watcher 中评估一些命令时。有用。为什么?? String regex = "/I-TASSER/output/
是否有 Matcher.appendReplacement() 和 Matcher.appendTail() 的替代方案,它采用 StringBuilder 而不是 StringBuffer ? 是否
我需要在循环中“缩短”字符串,然后一次又一次地传递它以与 java.regex.Pattern 匹配。对于一些深入参与解析和文本处理的人来说,这可能是一个微不足道的情况。 我面临着必须使用的情况: s
为什么第一个 block 有效而第二个 block 不有效? int numberOfDigits = 2; Pattern p = Pattern.compile("[01]{"+numberOfD
我是 c# 的新手,正在尝试将以下代码转换为 c#,但在 c# 中找不到任何 api 来执行此操作。 请解释 matcher.start() 和 matcher.end() 的等价物。 c# 中 ma
我注意到调用 Matcher.lookingAt() 会影响 Matcher.find()。我在我的代码中运行了 lookingAt(),它返回了 true。然后,当我运行 find() 以便开始返回
我正在进行一些测试,以便重构一个旧的 C++ 项目。我正在尝试使用 gmock 匹配器 ElementsAreArray() 来匹配两个数组。 EXPECT_THAT(value_instance.v
我正在寻找一种方法来确定单个正则表达式是否匹配整个字符串、字符串的开头或 C# 中的一部分。 在 Java 中,您可以构造一个 Matcher 对象,并使用方法 matches() 来检查它是否与整个
给定一个 Collection 或 Iterable 项目,是否有任何 Matcher(或匹配器组合)可以断言每个项目都匹配一个匹配器? 例如,给定这个项目类型: public interface P
我看到有一些关于 Java Matcher 类的帖子,但我找不到关于特定方法 find() 和 group() 的帖子. 我有这段代码,其中 Lane 和 IllegalLaneException 已
我是一名优秀的程序员,十分优秀!