Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用GoogleMock模拟由被测代码创建的实例_C++_Unit Testing_Googletest_Googlemock - Fatal编程技术网

C++ 使用GoogleMock模拟由被测代码创建的实例

C++ 使用GoogleMock模拟由被测代码创建的实例,c++,unit-testing,googletest,googlemock,C++,Unit Testing,Googletest,Googlemock,我已经创建了一个接口(这里是一个示例): 有具体实施的,例如: class SerialDataStream : public DataStream { public: // NOTE: This constructor will throw an exception if the // serial port cannot be opened. SerialDataStream(string port, int baudrate); std::string re

我已经创建了一个接口(这里是一个示例):

有具体实施的,例如:

class SerialDataStream : public DataStream
{
public:
    // NOTE: This constructor will throw an exception if the
    // serial port cannot be opened.
    SerialDataStream(string port, int baudrate);
    std::string read(std::string terminator);
    size_t write(std::string data);
}
并且使用了接口,例如:

class SomeThing
{
public:
    SomeThing(std::shared_ptr<DataStream> stream);
}
class MockDataStream : public DataStream
{
public:
    MOCK_METHOD1(read, size_t(std::vector<uint8_t>&));
    MOCK_METHOD1(write, size_t(std::vector<uint8_t>&));
}
datastream.write("DISCOVER");
string response = datastream.read("\n");
if (discovery_ok(response))
{ 
    // do stuff
}

我很确定我已经回答了我自己的问题,除了伪造SerialDataStream类和使用依赖注入,公开私有API并通过GoogleMock简单地测试它们之外,我别无选择,但我愿意接受建议,如果有更好的方法我可以/应该在这里做事。

查看您提供的代码片段,我发现自己在问:
函数究竟应该做什么?好像是这样的
(1) 创建一个SerialDataStream并
(2) 检查设备是否已连接

您可以将功能分成两部分(可单独测试)。
还有一个问题是如何处理std::shared\u ptr serialstream=std::make_shared(“/dev/tty99”,115200)-在某个时候,您需要处理(隐藏的)新的

我同意你的观点——依赖注入可能是解决方案。将任何最终负责创建的类或函数转换为模板类/函数都将允许您编写(例如)

模板
std::shared_ptr createDatastream()
{
std::共享的ptr数据流(nullptr);
std::shared_ptr datastream=std::make_shared(“/dev/tty99”,115200);
返回数据流;
}

然后在应用程序中使用
SerialDataStream
实例化类/函数,同时使用
MockDataStream
测试函数。

是的,这完全正确,我将“检查连接的设备”设置为公共静态API,因此它是可测试的。我非常喜欢你关于模板的建议,这是一个很好的解决方案,我会尝试一下,非常感谢!
std::shared_ptr<MockDataStream> mock_stream(nullptr);
mock_stream = std::make_shared<MockDataStream>();
EXPECT_CALL(*mock_stream, write("START")).Times(AtLeast(1));
EXPECT_CALL(*mock_stream, read("\n")).Times(AtLeast(1));
SomeThing some_thing = SomeThing(mock_stream);
std::shared_ptr<DataStream> datastream(nullptr);

// Try and open the serial port:
try
{
    std::shared_ptr<SerialDataStream> serialstream =
        std::make_shared<SerialDataStream>("/dev/tty99", 115200);
}
catch (...) 
{
    // Returns a nullptr
    return datastream;
}

// Check if there is a known device on the other end:
datastream = std::static_pointer_cast<DataStream>(serialstream);
if (!device_is_connected(datastream))
{
    datastream = nullptr;
}
return datastream;
datastream.write("DISCOVER");
string response = datastream.read("\n");
if (discovery_ok(response))
{ 
    // do stuff
}
template<typename T>
std::shared_ptr<DataStream> createDatastream()
{
    std::shared_ptr<DataStream> datastream(nullptr);
    std::shared_ptr<T> datastream = std::make_shared<T>("/dev/tty99", 115200);
    return datastream;
}