2017-09-12 1 views
-2

JUnit은 스캐너를 사용하여 system.in에서 읽고 system.out으로 인쇄하는 간단한 기본 메서드 명령 줄 클래스를 테스트 할 수 있습니까? JUnit을 사용하여 Java에서 간단한 명령 줄 응용 프로그램을 테스트하는 방법

import java.util.Scanner; 

public class SimpleMainCmdApplication { 

    public static void main(String args[]) { 
     Scanner scanner = new Scanner(System.in); 
     System.out.println(scanner.next()); 
    } 
} 

내가 System.in (사용 스캐너) 및 읽 주요 방법으로는 * 된 .java 파일을 업로드 참가자를 필요로하는 코스 데이터 구조와 알고리즘 과정을하고있는 중이 야 꽤 특정 사용 사례입니다 System.out에 응답을 출력합니다. 코드를 업로드하면 웹 사이트는 응용 프로그램을 빌드하고 실행하며 알고리즘 성능을 테스트하고 측정합니다.

나는 이것을 시뮬레이션하는 방법을 원했기 때문에 각 할당에 대해 TDD 방식을 취하는 과정에서 JUnit을 사용하여 간단한 통합 테스트를 작성할 수 있습니다. 도움이되는 다른 스택 오버 플로우 스레드에는 유용한 포인터가 있지만 전체 요구 사항을 충족시키는 것은 없습니다.

답변

0

이 문제를 해결하기 위해 명령 줄 입력과 리플렉션을 통해 호출 할 기본 메서드 클래스의 이름을 전달할 수있는 개인 메서드가 만들어졌습니다. 그런 다음 표준 hamcrest macthers를 출력에 적용 할 수 있습니다.

import static org.hamcrest.CoreMatchers.is; 
import static org.junit.Assert.assertThat; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.InputStream; 
import java.io.PrintStream; 
import java.lang.reflect.Method; 

import org.junit.Before; 
import org.junit.Test; 

public class MainCmdTest { 

    private ByteArrayOutputStream byteArrayOutputStream; 
    private PrintStream console; 

    @Before 
    public void setup() { 
     byteArrayOutputStream = new ByteArrayOutputStream(); 
     console = System.out; 
    } 

    @Test 
    public void shouldPrintTest() throws Exception { 
     runTest("test", "SimpleMainCmdApplication"); 
     assertThat(byteArrayOutputStream.toString(), is("test\n")); 
    } 

    private void runTest(final String data, final String className) throws Exception { 

     final InputStream input = new ByteArrayInputStream(data.getBytes("UTF-8")); 
     final InputStream old = System.in; 

     try { 
      System.setOut(new PrintStream(byteArrayOutputStream)); 
      System.setIn(input); 

      final Class<?> cls = Class.forName(className); 
      final Method meth = cls.getDeclaredMethod("main", String[].class); 
      final String[] params = new String[]{}; 
      meth.invoke(null, (Object) params); 

     } finally { 
      System.setOut(console); 
      System.setIn(old); 
     } 
    } 
} 

실제 구현에서는 코드를 실행하는 데 걸리는 시간을 측정하고 테스트 할 임계 값 한도를 설정할 수 있습니다.

관련 문제