Google Mock:模拟fstream对象和测试中的执行控制

时间:2016-03-20 20:59:48

标签: c++ unit-testing fstream googletest googlemock

我需要为以下功能编写一些单元测试。为了做到这一点,我需要模拟ifstream对象。我做到了,但我在测试期间控制执行有问题。如何设置get in返回的值 while(p_fileDescriptor->get(l_singleByte)) 在一种情况下eofbit对象和在另一种情况下的“正常”istream对象?我尝试了一些选项,但它不起作用。你能帮帮我吗? 贝娄功能有我的单元测试。 测试功能:

void ServerSendFileRequestHandler::sendRequestedFile(std::shared_ptr<std::istream> p_fileDescriptor, int& p_clientSocket) const
{
unsigned int l_msgCounter = 1;
unsigned long long l_byteCounter = 0;
Message l_sendline;
memset(&l_sendline, 0, sizeof(l_sendline));

char l_singleByte;
while(p_fileDescriptor->get(l_singleByte))
{
    checkIfReadByteSucceded(p_fileDescriptor, l_byteCounter);
    l_sendline.payload[l_byteCounter] = l_singleByte;
    l_byteCounter++;

    if(l_byteCounter == PAYLOAD_SIZE)
    {
        std::cout << "Sending message number: " << l_msgCounter << std::endl;
        sendClientSendFileInd(l_sendline, l_byteCounter, p_clientSocket);
        l_msgCounter++;

        l_byteCounter = 0;
        memset(&l_sendline, 0, sizeof(l_sendline));
    }
}

if(l_byteCounter)
{
    std::cout << "Sending message number: " << l_msgCounter << std::endl;
    sendClientSendFileInd(l_sendline, l_byteCounter, p_clientSocket);
    l_msgCounter++;
}
std::cout << "Sending of file is done!" << std::endl;
}

我的单元测试:

#include "gmock/gmock.h"
#include <istream>
using namespace std;
class FstreamMock : public std::istream  
{
public:
    MOCK_METHOD1(get, istream&(char&));
};

using namespace testing;
TEST_F(ServerSendFileRequestHandlerTestSuite, sendRequestedFileTest)
{
    int l_clientSocket = 0;
    std::shared_ptr<FstreamMock> l_fileDescriptor;
    const bool i = false;

    char l_byte;
    //EXPECT_CALL(*l_fileDescriptor, get(_)).WillRepeatedly(ReturnRef(*l_fileDescriptor));
    EXPECT_CALL(*l_fileDescriptor, get(_)).WillRepeatedly(ReturnRef(*l_fileDescriptor);
    m_sut.sendRequestedFile(l_fileDescriptor, l_clientSocket);
}

1 个答案:

答案 0 :(得分:2)

你的方法并不好。 ifstream::get不是虚函数,因此模拟它不会产生预期影响:调用base istream

无论如何 - 您应该使用ifstream而不是ServerSendFileRequestHandler::sendRequestedFile - 在函数stringstream中 - 并且为了进行测试,您可以使用stringstream - 很容易断言所写的内容到ServerSendFileRequestHandler::sendRequestedStream。您可以将此功能名称更改为TEST_F(ServerSendFileRequestHandlerTestSuite, sendRequestedStreamTest) { std::istringstream stream("some input"); int l_clientSocket = 0; const bool i = false; char l_byte; m_sut.sendRequestedStream(stream, l_clientSocket); }

class IByteStream  
{
public:
    virtual ~IByteStream() = default;
    virtual char get() = 0;
};

或者,更好 - 你应该创建自己的抽象 - 定义你的接口,这是返回单个字节的东西:

std::istream

然后 - 基于class StdStreamByteStream : public IByteStream { public: StdStreamByteStream(std::istream& is) : is(is) {} char get() override { return is.get(); } private: std::istream& is; };

的实施
class ByteStreamMock : public IByteStream  
{
public:
    MOCK_METHOD0(get, char());
};

然后模拟:

{{1}}

拥有这些课程 - 只需更改您的实施和测试 - 它就能发挥作用。