2012-10-01 62 views
4

我想從文件中讀取數據並使用數據來測試特效。即使是要測試的過程也是從文件的內容中確定的。Junit與@Parameters來測試文件中的數據

Sample.txt的是從中我讀出的數據的文件,該文件包含以下數據

testproc=sample_check('N') 
output=yes 
type=function 
testproc=sample_check('N') 
output=yes 
type=function 
testproc=sample_check('N') 
output=yes 
type=function 

以下程序試圖讀取文件並填充它的內容到一個2維字符串數組。

@RunWith(value = Parameterized.class) 
public class Testdata extends Testdb { 

    public String expected; 
    public String actual; 

    @Parameters 
    public static Collection<String[]> getTestParameters() { 
     String param[][] = new String [3][3]; 
     String temp[] = new String [3]; 
     int i = 0; 
     int j = 0; 
     try{ 
      BufferedReader br = new BufferedReader(new FileReader("sample.txt")); 
      String strLine; 
      String methodkey  = "testproc"; 
      String methodtypekey = "type"; 
      String methodoutputkey = "output"; 
      String method = ""; 
      String methodtype = ""; 
      String methodoutput = ""; 

      //Read File Line By Line 
      while ((strLine = br.readLine()) != null) 
      { 
       StringTokenizer st = new StringTokenizer(strLine, "="); 
       while(st.hasMoreTokens()) 
       { 
        String key = st.nextToken(); 
        String val = st.nextToken(); 
        if (key.trim().equalsIgnoreCase(methodkey)) 
        { 
         method = val.trim(); 
         temp[j] = "SELECT " + method + " FROM dual"; 
         j++; 
        } 
        else if (key.trim().equalsIgnoreCase(methodoutputkey)) 
        { 
         methodoutput = val.trim(); 
         temp[j] = methodoutput; 
         j++; 
        } 
        else if (key.trim().equalsIgnoreCase(methodtypekey)) 
        { 
         methodtype = val.trim(); 
         if (methodtype.trim().equalsIgnoreCase("function")) 
         { 
          System.out.println(i + " " + method); 
          param[i] = temp; 
          i++; 
          j = 0; 
         } 
        } 
       } 

      } 
     } 
     catch (Exception e){//Catch exception if any 
      System.err.println("Error: " + e.getMessage()); 
     } 

     return Arrays.asList(param)   ; 
    } 

    public Testdata(String[] par) { 
     this.expected = par[0]; 
     this.actual = par[1]; 
    } 

    @Test 
    public void test_file_data() //throws java.io.IOException 
    { 
     testString("Output should be"+expected , expected, actual); 
    } 


} 

我收到一個錯誤 java.lang.IllegalArgumentException異常:參數錯號

的TestString是連接到數據庫,檢查的方法,如果實際值吻合與預期的結果。這需要兩個字符串值作爲參數。

我的問題是應該如何 回報Arrays.asList(PARAM) 和方法 公共TESTDATA(字符串[] PAR) 樣子?

我測試使用這一點,它工作正常,但因爲我從文件中讀取,我想用這需要用回Arrays.asList

return Arrays.asList(new String[][]{ 
      { "yes", "SELECT sample_check('N') FROM dual"}, 
      { "yes", "SELECT sample_check('N') FROM dual"}, 
      { "yes", "SELECT sample_check('N') FROM dual"} 
    })   ; 
} 

public Testdata(String expected, 
          String actual) { 
    this.expected = expected; 
    this.actual = actual; 
} 

在得到這個工作有什麼建議返回一個數組?

+0

其中java.lang.IllegalArgumentException被拋出? –

+0

另外,我認爲使用像ArrayList這樣的Collection會更容易,而不是使用param和temp數組。我懷疑param沒有正確設置,可能是發生問題的地方。 –

+0

java.lang.IllegalArgumentException:參數數量錯誤 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)關於使用集合,我能否使用類似於上面的String [] []數組的二維集合?原因是Testdata需要兩個字符串值,每個測試用例需要是一個數組或類似的數據,並且由於會有多個測試用例,因此它需要一個二維數組。 – user1669327

回答

4

你的構造函數是錯誤的。你需要相同數量的,你有你的String[]

public Testdata(String[] par) { 
    this.expected = par[0]; 
    this.actual = par[1]; 
} 

項目參數這應該是:

public Testdata(String expected, String actual, String somethingElse) { 
    this.expected = expected; 
    this.actual = actual; 
} 

javadoc for Parameterized

例如,測試斐波納契功能,寫:

@RunWith(Parameterized.class) 
public class FibonacciTest { 
    @Parameters 
    public static List<Object[]> data() { 
     return Arrays.asList(new Object[][] { 
       { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } 
     }); 
    } 

    private int fInput; 
    private int fExpected; 

    public FibonacciTest(int input, int expected) { 
     fInput= input; 
     fExpected= expected; 
    } 

    @Test 
    public void test() { 
     assertEquals(fExpected, Fibonacci.compute(fInput)); 
    } 
} 

每個FibonacciTest實例都將使用 雙參數構造函數和@Parameters 方法中的數據值構造。

+0

感謝您的提示。這正是問題。使用「公共Testdata(字符串預期,字符串實際,字符串somethingElse){this.expected =預期; this.actual =實際;}」修復它 – user1669327

+0

您可以標記爲接受,然後請?謝謝。 –