좋아, 네트워크 소켓에 대한 추상화를 만드는 것으로 시작하자. 호출을 시스템 기능으로 조롱 할 수 있어야합니다. 이 같은 시작 :
class Socket {
public:
virtual bool connect(const struct sockaddr *address, socklen_t address_len) = 0;
virtual Socket* accept(struct sockaddr *restrict address, socklen_t *restrict address_len) = 0;
/* more functions */
}
위의 코드는 sockaddr
및 socklen_t
을 사용하고 있기 때문에, 물건과 유닉스 클래스의 결합이 아닌 추상적 많이한다. 또한 두 가지 유형의 플랫폼에 독립적 인 코드를 사용하기 위해 추상화를 작성해야하지만 이는 설계에 따라 다릅니다.
실제 응용 프로그램에서 사용하기 위해 구체적인 TCP/UDP 클래스를 만들 필요는 없습니다.
class TCPSocket : public Socket {
public:
TCPSocket() {
socket_ = socket(PF_INET, SOCK_STREAM, 0);
if (socket_ == -1) {
/* handle errors */
}
}
TCPSocket(int sock) : socket_(sock) {}
bool connect(const struct sockaddr *address, socklen_t address_len) override {
return connect(socket_, address, address_len) == 0;
}
Socket* accept(struct sockaddr *restrict address, socklen_t *restrict address_len) override {
int s = accept(socket_, address, address_len);
if (s == -1) {
/* handle errors */
}
return new TCPSocket(s);
}
private:
int socket_;
}
Phew :) 수업에 착수합시다.
클래스 이름이 A
이며 method
테스트 방법이 있다고 가정합니다. 클래스에서 생성자로 Socket*
을 가져 오거나 method
은 Socket*
을 매개 변수로 사용해야합니다. 그런 다음 테스트 코드에서 모의를 지정할 수 있습니다.
class MockSock : public Socket {
public:
MOCK_METHOD2(connect, bool(const struct sockaddr*, socklen_t));
MOCK_METHOD2(accept, Socket*(struct sockaddr*, socklen_t*));
}
는 단지 MockSock 인스턴스화 적절한
EXPECT_CALL
값
A
또는
method
로 전달한다.
소켓에 대한 추상화를 생성하여 클래스에 삽입합니다. 그럼 너는 그것을 조롱 할 수있다. –
@BartoszPrzybylski 몇 가지 예를 보여 주시겠습니까? 나는 개발 된 개발을 시험하기에 새롭고 어떻게 주사를 할 수 있는지 잘 모릅니다. 고마워. – Joe
TCP 연결을 나타내는 추상 기본 클래스를 작성하고 데이터 읽기/쓰기 등의 메소드를 가지고 있습니다. 그런 다음 프로덕션 코드는 실제 소켓을 사용하여 논리를 구현하는 클래스를 파생시킬 수 있으며 테스트 단위는 논리를 구현하는 다른 클래스를 파생시킬 수 있습니다 가짜 데이터를 사용합니다. 모든 기본 클래스 인터페이스를 사용하여 나머지 유닛 코드를 작성한 다음 필요할 때 적절한 파생 클래스를 인스턴스화 할 수 있습니다. 이렇게하면 실제 네트워크 동작을 테스트하지 않는 한 테스트 중에 실제 소켓을 사용할 필요가 없습니다. –