按照Patterns for unit testing a C++ method that makes a standard library call,我正在试驾一个网络抽象类的开发。为了单元测试使标准C库调用(我无法模拟)处理BSD套接字的代码,我定义了一个接口ISocket
,我的实际实现CSocket
和模拟MockSocket
都从中继承。我试图用googlemock模拟一个简单的C++方法有什么问题?
现在我写的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));
};
}
任何想法我在这里做错了吗?
'(MockSocket)* socket_ptr' ......这是一个复制。 – 2011-04-25 20:47:41
好的,这当然解释了编译器的消息......现在我的'EXPECT_CALL'应该是什么样子? gmock不想要一个指针 - 如果我说'EXPECT_CALL((MockSocket *)socket_ptr,...',编译器会抱怨:'NetworkTest.cc:35:error:''中的成员'gmock_Socket'的请求(JrStream: :(JrStream :: NetworkTest_InitCallsSocket_Test *)this) - > JrStream :: NetworkTest_InitCallsSocket_Test :: .JrStream :: NetworkTest :: socket_ptr',它是非类类型'JrStream :: MockSocket *'' –
2011-04-26 03:51:25
Shouldn它的工作是这样的:* static_cast(socket_ptr)? –
2011-04-27 15:52:26