2010-05-21 6 views
35

내가 함께 자바 클래스에서 JUnit 테스트를 실행하려고 오전 :패스 명령 행 인수는 프로그래밍 방식으로 실행되고

JUnitCore core = new JUnitCore(); 
    core.addListener(new RunListener()); 
    core.run(classToRun); 

문제는 내 JUnit 테스트입니다 현재에 하드 코딩 된 데이터베이스 연결이 필요합니다 JUnit 테스트 자체.

내가 찾고있는 것은 JUnit 테스트를 프로그래밍 방식으로 (위) 실행하지만 테스트를 실행하는 Java 클래스에서 데이터베이스 연결을 전달하고 JUnit 클래스 내에서 하드 코딩하지 않는 방법입니다.

기본적으로 그런 다음 classToRun 내

JUnitCore core = new JUnitCore(); 
    core.addListener(new RunListener()); 
    core.addParameters(java.sql.Connection); 
    core.run(classToRun); 

같은 :

@Test 
Public void Test1(Connection dbConnection){ 
    Statement st = dbConnection.createStatement(); 
    ResultSet rs = st.executeQuery("select total from dual"); 
    rs.next(); 
    String myTotal = rs.getString("TOTAL"); 
    //btw my tests are selenium testcases:) 
    selenium.isTextPresent(myTotal); 
} 

내가 @parameters에 대해 알고 있지만,이 같은 테스트를 실행하기위한 더로 여기에 적용하지 않는 것 여러 번 다른 값을 갖는 경우. 모든 테스트 케이스에서 구성 파일을 통해 내 Java 클라이언트로 전달하는 데이터베이스 연결을 공유 한 다음 해당 테스트 케이스를 실행하고 (구성 파일을 통해 전달되는 경우)

이것이 가능합니까?

P. 나는 이것이 이상한 일을하는 것처럼 보인다고 이해합니다.

답변

41

자바 시스템 속성을 사용하여이를 수행 할 수 있습니다.

-Dconnectionstring=foobar과 함께 junit 명령 줄에 전달하거나 시스템 속성에 java api를 사용하여 프로그래밍 방식으로 System.setProperty(String name, String value)System.getProperty(String name)으로 설정하면됩니다.

테스트에서는 @Before 또는 @BeforeClass을 사용하여이 속성을 기반으로 공통 개체를 설정할 수 있습니다. 각 테스트마다 설정을 한 번만 실행할지 (클래스 멤버를 사용할 수 있는지) 또는 한 번만 실행할지 여부를 결정할 수 있습니다 각 스위트 (정적 멤버를 사용).

모든 테스트 사례가 확장하는 추상 클래스를 사용하여이 동작을 분해 할 수도 있습니다.

+0

System.set/getProperty() 메서드는 실행중인 테스트 클래스에 변수를 전달하기에 충분했습니다. 고맙습니다! –

+0

이 방법으로 인수를 전달하면 -Dconnectionstring = foobar입니다. 런타임에 어떻게 추출 할 수 있습니까? –

+1

@TomKoptel 당신은'String value = System.getProperty ("connectionstring");'과 같은 것을 사용하여 값을 얻는다. – tonio

관련 문제