2014-03-03 1 views
2

Google Mock Framework를 사용하여 직렬 포트 관리자 클래스를 통한 단위 테스트를 수행하고 있습니다. 내가 테스트를 실행하면Google mock을 사용하는 포인터 오류가 잘못되었습니다.

TEST(SerialPortManagerTest,AllPortsAreClosedAtInit){ 

MockSerialPort port1; 
EXPECT_CALL(port1, IsOpen()).Times(Exactly(1)).WillOnce(Return(false)); 

MockSerialPort port2; 
EXPECT_CALL(port2, IsOpen()).Times(Exactly(1)).WillOnce(Return(false)); 

MockSerialPort port3; 
EXPECT_CALL(port3, IsOpen()).Times(Exactly(1)).WillOnce(Return(false)); 

SerialPortInterface* port1Ptr=&port1; 
SerialPortInterface* port2Ptr=&port2; 
SerialPortInterface* port3Ptr=&port3; 

MockSerialPortFactory portFactory; 
EXPECT_CALL(portFactory, CreateSerialPort(_)).Times(3). 
     WillOnce(ReturnPointee(&port1Ptr)). 
     WillOnce(ReturnPointee(&port2Ptr)). 
     WillOnce(ReturnPointee(&port3Ptr)); 

SerialPortFactoryInterface* portFactoryPtr=&portFactory; 

SerialPortManager* serialPortManager =new SerialPortManager(portFactoryPtr); 

EXPECT_FALSE(serialPortManager->GetPort(COM1)->IsOpen()); 
EXPECT_FALSE(serialPortManager->GetPort(COM2)->IsOpen()); 
EXPECT_FALSE(serialPortManager->GetPort(COM3)->IsOpen()); 
} 

가 잘못된 반환 : 내가 사용 클래스 다이어그램 내가 직렬 포트 관리자를 테스트하기 위해 준비했습니다 시험의

enter image description here

하나입니다 포인터 오류 :

free(): invalid pointer: 0xbfc8d8e4 *** 

문제를 보면 나는 내가 SerialPortManag에 serialPortFactory을 삭제 라인을 주석 처리하면 오류가 반환되지 않습니다 발견 소멸자.

SerialPortManager::~SerialPortManager() { 
    for (int i = 0; i < PORT_COUNT; i++) { 
     delete ports[i]; 
    } 
    //delete serialPortFactory; 
} 

이 잘못된 포인터 오류가 발생하지 않고 serialPortFactory를 조롱 할 수 있습니까?

답변

1

테스트에서 직렬 포트가 두 번 삭제되기 때문에 오류가 발생합니다. 처음에는 MockSerialPort이 테스트에서 제외 될 때 발생합니다. 두 번째 시간은 소멸자 내에서 SerialPortManager에 대해 발생합니다. SerialPortManager에서 직렬 포트를 삭제하려는 경우 테스트 중에 힙에 직렬 포트를 선언해야합니다.

TEST(SerialPortManagerTest,AllPortsAreClosedAtInit){ 

MockSerialPort* port1 = new MockSerialPort; 
EXPECT_CALL(*port1, IsOpen()).Times(Exactly(1)).WillOnce(Return(false)); 

// Same for the other two serial ports. 

MockSerialPortFactory portFactory; 
EXPECT_CALL(portFactory, CreateSerialPort(_)).Times(3). 
     WillOnce(Return(port1)). 
     WillOnce(Return(port2)). 
     WillOnce(Return(port3)); 

// Same as before 
} 
관련 문제