2011-03-31 1 views
1

이 질문은 이전에 요청되었지만 알 수있는 부분까지 명확하게 설명하지 않았습니다. 이 주제에 대해 본 하나 또는 두 개의 다른 스레드와 비슷하게, 로그인 클라이언트의 명령 줄 입력과 채팅 클라이언트에서 작업 중이므로 JUnit 테스트에서이를 시뮬레이트하는 방법을 확신 할 수 없습니다. 케이스. 다른 답변은 System.in을 별도의 InputStream으로 변경해야한다고 지적했으나 그 다음은 무엇입니까?JUnit 명령 줄 테스트

tl; dr : 실제 코드에서 명령 줄 입력을 구문 분석하는 방법이 있으며 입력 및 적절하게 처리 된 JUnit 테스트 방법이 필요합니다.

답변

1

편집 : 나는 그 질문을 오해 한 것 같습니다. 필자는 대개 대화식 콘솔 입력보다는 시작하기 위해 명령 줄 인수를 참조 할 때 "명령 줄 입력"이라는 용어를 사용합니다. 그러나 ...

실제 코드를 다른 InputStream 또는 심지어 Reader 또는 Scanner으로 넘겨 주면 콘솔에서 "입력 받기"부분을 분리 할 수 ​​있습니다. 그런 다음 입력 코드를 테스트 코드에서 입력으로 사용하고 바이트로 변환하고 ByteArrayInputStream에 해당 바이트를 래핑하거나 문자열을 StringReader에 직접 래핑하여 하나의 입력을 모두 가짜로 만들 수 있습니다.

이 단점은 결과를 확인하기 위해 하나의 명령 후에이 "일시 중지"를 만드는 쉬운 방법이 없다는 것입니다.

를 판독하는 부분이 입력 입력 처리하는 부분으로부터 분리되도록 설계 정도를 변경할 수도

. 그런 다음 잠재적으로 단위 테스트에 의해 검증되지 않은 부분을 떠나, 또는 상대적으로 원시적 인 테스트를 작성할 수

String line; 
while ((line = reader.readLine()) != null) { 
    handleInput(line); 
} 

-하지만 당신은, 다음 테스트 handleInput 광범위하게 허용 : 읽기 부분의 순서에, 아주 간단한 루프 수 이제 입력 소스와 분리됩니다.


원래 대답

당신이 정말로 응용 프로그램을 시작하는 코드에서 구문 분석 코드를 추출했다면, 그것은 쉽게 : 해당 코드를 실행하고 결과를 확인. 물론 옵션을 캡슐화하는 일종의 클래스를 사용하면 가장 쉽습니다. 예를 들어, main 방법은 다음과 같습니다

public static void main(String[] args) { 
    Options options = Options.parse(args); 
    // Use options here 
} 

그런 다음 당신은 그냥 아주 쉽게 Options.parse을 테스트 할 수 있습니다.

+0

나는 방금 전설적인 뇌뇌를 가지고 있을지 모르지만, 이것이 정말로 내 질문에 답하지는 않는다고 생각합니다. "Welcome, please command into :"JUnit 테스트 케이스 내부에서 루프를 시작할 수 있지만, 메인 테스트 방법이없는 위 테스트 케이스의 명령을 입력하려면 어떻게해야합니까? –

+0

@ 닉 : 아, 알겠습니다. "커맨드 라인 입력 (command line input)"은 커맨드 라인 인수를 의미한다고 생각했지만, 대화 형 콘솔 입력을 의미하는 반면. 편집 할 것입니다. –

+0

나는 독서에서 취급을 분리하는 것이 나의 압정이기 위하여려고하고 있다는 것을 생각한다. JUnit에서 원하는대로 수동으로 전달할 수 있도록 문자열 인수를 사용하는 메소드가 있으면 내 인생이 쉬워집니다. 감사. –