2011-04-25 25 views
0

按照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)); 
    }; 
} 

任何想法我在这里做错了吗?

回答

1

我终于把它排序了。绊倒我的是我想使用一个指针,但是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 

这很好,但我不知道如何使这项工作,如果我真的需要我的指针。听起来像是读者的练习。 ;)

3

看起来像是在没有强制转换的情况下在TestBody某处调用MockSocket的拷贝构造函数。

+1

'(MockSocket)* socket_ptr' ......这是一个复制。 – 2011-04-25 20:47:41

+0

好的,这当然解释了编译器的消息......现在我的'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

+1

Shouldn它的工作是这样的:* static_cast (socket_ptr)? – 2011-04-27 15:52:26

0

如何:

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)); 

}

(免责声明 - 我没有检查它是否编译...)

相关问题