C++ I';我试图从gmock类返回一个rapidjson::值,但我可以';我好像没法让它发挥作用
我正试图对我的一个类进行单元测试,但我很难从模拟类返回rapidjson::值 我环顾了一下互联网,到目前为止还没有成功。这是我最后一次尝试 我运行的代码如下:C++ I';我试图从gmock类返回一个rapidjson::值,但我可以';我好像没法让它发挥作用,c++,googletest,googlemock,rapidjson,C++,Googletest,Googlemock,Rapidjson,我正试图对我的一个类进行单元测试,但我很难从模拟类返回rapidjson::值 我环顾了一下互联网,到目前为止还没有成功。这是我最后一次尝试 我运行的代码如下: class json_action_audit_generator_tests : public ::testing::Test { std::string test_focus_array = "[[11,12],[21,22],[31,32],[41,42],[51,52],[61,62],[71,72],[81,82],
class json_action_audit_generator_tests : public ::testing::Test
{
std::string test_focus_array = "[[11,12],[21,22],[31,32],[41,42],[51,52],[61,62],[71,72],[81,82],[91,92],[101,102],[111,112],[121,122],[131,132]]";
Value create_json_key_from_enum(storage_enum mapped_value, rapidjson::Document& root)
{
return Value(storage_from_enum[mapped_value].c_str(), root.GetAllocator());
}
}
TEST_F(json_action_audit_generator_tests, TestAddJsonFocusInformation)
{
std::stringstream ss;
ss << "{\"" << storage_from_enum[storage_enum::JsonFocus] << "\":"
<< "["
<< "[" << "11,12" << "]" << ","
<< "[" << "21,22" << "]" << ","
<< "[" << "31,32" << "]" << ","
<< "[" << "41,42" << "]" << ","
<< "[" << "51,52" << "]" << ","
<< "[" << "61,62" << "]" << ","
<< "[" << "71,72" << "]" << ","
<< "[" << "81,82" << "]" << ","
<< "[" << "91,92" << "]" << ","
<< "[" << "101,102" << "]" << ","
<< "[" << "111,112" << "]" << ","
<< "[" << "121,122" << "]" << ","
<< "[" << "131,132" << "]"
<< "]"
<< "}";
rapidjson::Document root;
root.SetObject();
Value json_focus_information(rapidjson::kObjectType);
add_json_string_member(root, root, create_json_key_from_enum(storage_enum::JsonFocus, root), test_focus_array.c_str());
json_action_audit_generator testee(dashboard_action.get(), EKS.get(), json_focus_serializer.get());
----------
EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value()).WillOnce(Return(&json_focus_information));
----------
testee.add_json_focus_information();
EXPECT_EQ(ss.str(), testee.create_json_string());
};
问题是在
EXPECT\u调用中
尝试从声明为返回rapidjson::Value
的函数返回rapidjson::Value*
如果rapidjson::Value
有一个正确的复制构造函数,那么您需要做的就是使用WillOnce(Return(json\u focus\u information))
(注意缺少的符号和)
然而,由于rapidjson不允许您在不指定分配器的情况下创建rapidjson::Value
的副本,所以事情就不那么容易了。
我知道从模拟中返回json\u focus\u信息副本的一种方法是使用::testing::Invoke
操作,而不是像这样使用::testing::return
:
auto return_json_focus_information = [&]() -> rapidjson::Value {
static auto allocator = rapidjson::MemoryPoolAllocator{};
return rapidjson::Value{json_focus_information, allocator};
}
EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
.WillOnce(::testing::Invoke(return_json_focus_information));
但是请注意,与testing::Return
相反,副本将在调用get\u focus\u时创建,而不是在设置期望时创建
但是,如果在测试中您甚至不需要json\u focus\u信息
变量,那么您也可以使用它
auto return_json_focus_information = []() -> rapidjson::Value {
return rapidjson::Value{rapidjson::kObjectType};
}
EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
.WillOnce(::testing::Invoke(return_json_focus_information));
并且完全去掉原始的json\u focus\u信息
变量。与您的问题无关,但是为什么要这样做呢,例如当然。我可以在以后更新字符串。我现在只想把它编译出来!另外,感谢您提供的样式提示。您正试图调用一个不允许触摸的GenericValue
构造函数。我们无法从这个错误判断问题出是复制构造函数、移动构造函数还是默认构造函数。知道gmock actions.h
中的哪一行已经很有帮助了(我很确定这个错误还将您链接到GenericValue
定义中的正确位置,这样我们就可以找到它试图使用的构造函数)。您能详细说明一下您的意图吗?你想用这段代码实现什么?@MaxLanghof-目前正在gmock actions.h的第562行调用它。这最终到达gmock internal utils.h中的第496行。这看起来像是通过一组论点来构建的。太棒了!这是可行的,答案非常棒!我完全理解为什么它以前不工作!先生/女士,你是蜜蜂的膝盖!
#pragma once
#include "document.h"
#include <string>
class json_focus_serializer_interface {
public:
json_focus_serializer_interface() = default;
virtual ~json_focus_serializer_interface() = default;
virtual rapidjson::Value get_focus_as_json_value() = 0;
virtual std::string get_focus_as_json_string() = 0;
};
#pragma once
#include "json_focus_serializer_interface.h"
#include "gmock/gmock.h"
class mock_json_focus_serializer_interface : public json_focus_serializer_interface {
public:
mock_json_focus_serializer_interface() = default;
~mock_json_focus_serializer_interface() = default;
MOCK_METHOD(rapidjson::Value, get_focus_as_json_value, (), (override));
MOCK_METHOD(std::string, get_focus_as_json_string, (), (override));
};
auto return_json_focus_information = [&]() -> rapidjson::Value {
static auto allocator = rapidjson::MemoryPoolAllocator{};
return rapidjson::Value{json_focus_information, allocator};
}
EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
.WillOnce(::testing::Invoke(return_json_focus_information));
auto return_json_focus_information = []() -> rapidjson::Value {
return rapidjson::Value{rapidjson::kObjectType};
}
EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
.WillOnce(::testing::Invoke(return_json_focus_information));