2012-04-28 2 views
1

Socket 객체를 읽고 쓰는 메소드의 클래스를 단위 테스트하려고합니다. 궁금 해서요, 이것에 대해 가장 좋은 방법은 무엇입니까? 저는 팀 (대학 프로젝트)에서 일하고 있으며이 (Java) 클래스에만 책임이 있으므로 코드를 완전히 리팩터링하는 것은 실제로 선택 사항이 아닙니다.모범 사례 : Socket을 인수로 사용하는 메서드 테스트 단위?

"Mocket"과 같은 종류의 모의 소켓을 사용할 수 있습니까? 어떻게이 문제에 접근하겠습니까?

내가 언급했듯이, 나는 대학생이기 때문에 포럼의 지혜에서 배울 것을 고대하고있다. 답변 할 시간을내어 주셔서 감사합니다.

+1

예, 소켓을 조롱하십시오. –

+0

메릴랜드, 어떻게 할 수 있습니까? 링크를 게시 하시겠습니까? – Plastech

답변

2

Socket에 의존하는 클래스는 코드를 테스트 할 수 있도록하기 위해 소켓의 추상화 (예 : 읽기 및 쓰기와 같은 사용 방법을 제공하는 간단한 인터페이스)에 의존해야합니다. 응용 프로그램에서는 실제 Socket 클래스의 래퍼를 사용하지만 유닛 테스트에서는 mock을 사용할 수 있습니다 (이 경우 JMock을 확인하십시오).

고려 :

public interface ISocket 
{ 
    byte[] read(); 
    int write(byte[] content); 
} 

public class SocketWrapper : ISocket 
{ 
    // read and write methods simply delegate work to real socket 
} 

public class ClassToTest 
{ 
    private ISocket socket; 

    public ClassToTest(ISocket socket) 
    { 
     this.socket = socket; 
    } 
} 

지금 당신의 단위 테스트 당신이 ISocket의 모형을 만들 수 ClassToTest 생성자에 전달합니다. 이렇게하면 단위 테스트가 종속성과 분리됩니다. 그 인터페이스를 구현하는 클래스를 생성 한 후

public interface IClient{ 
bool connect(...); 
bool disconnect(...); 
bool sendData(...); 
} 

:

+0

+1하지만 제 생각에는 인터페이스가 클라이언트 여야하며 소켓이 아니어야합니다. 그러면이 코드 조각에 더 많은 추상화가 생깁니다. – AlexTheo

0

나는 당신처럼 먼저 소켓 인터페이스를 선언 할 필요가 있다고 생각합니다. 이 클래스에는 Socket이 포함됩니다.

코드를 테스트해야하는 클래스에서 구체적인 구현이 아닌 클라이언트의 인터페이스를 전달합니다. 이 방법으로 : 1) 테스트 한 클래스에서 변경하지 않고 시스템의 동작을 교환 할 수 있습니다. 2) 필요한 구현으로 클라이언트를 조롱 할 수 있으므로 소켓을 인수로 사용하는 것보다 훨씬 쉽게 코드를 테스트 할 수 있습니다.

0

좋은 제안, 감사합니다! 문제는 내가 autograder를 깨지 않기 위해 주어진 인터페이스/api를 보존해야한다는 것이 었습니다.

내가 대신했던 것은 Socket 클래스를 서브 클래스 화 (서브 클래스 Mocket 호출을 끝내 었음) 한 다음 getInputStream 및 getOutputStream 메소드를 재정의하는 것이 었습니다. 이를 통해 메소드 안팎으로의 데이터 흐름을 제어 할 수 있었으며 테스트에 충분했습니다.

감사합니다.

+0

이 방법을 사용하면 테스트 코드에서 실제 '소켓'을 사용하여 종속성을 종료하는 것입니다. 테스트에 사용하기 위해 생성 된'Mocket' 클래스는 테스트하지 않는 코드 인'Socket' 클래스에서 depende합니다. 코드를 테스트 할 때는 경계를 유지해야하며 코드 만 테스트하고 다른 사람은 코드를 테스트하지 말아야합니다. @jimmy_keen은 좋은 대답이었습니다. –

관련 문제