我尝试用googlemock模拟简单的C ++方法有什么问题?

| 按照用于进行标准库调用的C ++方法进行单元测试的模式,我正在测试网络抽象类的驱动开发。为了对进行标准C库调用(我无法模拟)以处理BSD套接字的代码进行单元测试,我定义了接口
ISocket
,我的实际实现
CSocket
和mock2 mock都从该接口继承。 现在,我为
Network
类编写我的第一个单元测试,它使用
ISocket
进行繁重的工作:
#include \"gmock/gmock.h\"
#include \"gtest/gtest.h\"
// C standard library includes omitted
#include \"MockSocket.h\"
#include \"Network.h\"

using ::testing::Return;
namespace JrStream {
  class NetworkTest : public ::testing::Test {
  protected:
    Network net;
    ISocket * socket_ptr;

    virtual void SetUp() {
      socket_ptr = new MockSocket();
    }
  };

  TEST_F(NetworkTest, InitCallsSocket) {
    EXPECT_CALL((MockSocket)*socket_ptr, Socket(AF_INET, SOCK_STREAM, 0))
        .Times(1)
        .WillOnce(Return(5)); //fake file descriptor

    ASSERT_TRUE(net.init(socket_ptr));
  }
} // namespace
// gtest boilerplate main() omitted
但是我在编译时收到此错误:
g++ -g -Wall -Lgtest-1.5.0/lib -Igmock-1.5.0/include -Igtest-1.5.0/include -I.. -I../../Debug/src -c -o NetworkTest.o NetworkTest.cc
NetworkTest.cc: In member function ‘virtual void JrStream::NetworkTest_InitCallsSocket_Test::TestBody()’:
NetworkTest.cc:35: error: no matching function for call to ‘JrStream::MockSocket::MockSocket(JrStream::ISocket&)’
MockSocket.h:16: note: candidates are: JrStream::MockSocket::MockSocket()
MockSocket.h:16: note:                 JrStream::MockSocket::MockSocket(const JrStream::MockSocket&)
这是我的界面和模拟的样子:
namespace JrStream {
  class ISocket {
    virtual int Socket(int domain, int type, int protocol) = 0;
  };
}

#include \"gmock/gmock.h\"
#include \"ISocket.h\"
namespace JrStream {
  class MockSocket: public JrStream::ISocket {
    MOCK_METHOD3(Socket, int(int domain, int type, int protocol));
  };
}
有什么想法我在这里做错了吗?     
已邀请:
看起来您正在调用TestBody中某个地方的MockSocket的副本构造函数,而没有强制转换。     
我终于把它整理好了。让我不寒而栗的是,我想使用一个指针,但是googlemock可用于类。这是有效的方法:
#include \"gmock/gmock.h\"
#include \"gtest/gtest.h\"
// C standard library includes omitted
#include \"MockSocket.h\"
#include \"Network.h\"

using ::testing::Return;
namespace JrStream {
  class NetworkTest : public ::testing::Test {
  protected:
    Network net;
    MockSocket sock;
  };

  TEST_F(NetworkTest, InitCallsSocket) {
    EXPECT_CALL(sock, Socket(AF_INET, SOCK_STREAM, 0))
        .Times(1)
        .WillOnce(Return(5)); //fake file descriptor

    ASSERT_TRUE(net.init(&sock));
  }
} // namespace
// gtest boilerplate main() omitted
这很好,但是我想知道如果我真的需要我的指针怎么做。听起来像是读者的练习。 ;)     
怎么样:
TEST_F(NetworkTest, InitCallsSocket) {
EXPECT_CALL(*((MockSocket)*socket_ptr), Socket(AF_INET, SOCK_STREAM, 0))
    .Times(1)
    .WillOnce(Return(5)); //fake file descriptor

ASSERT_TRUE(net.init(socket_ptr));
} (免责声明-我没有检查它是否可以编译...)     

要回复问题请先登录注册