2011-09-19 162 views
0

我編寫了一個課程類,該類具有從文本和二進制文件中讀取並具有寫入文本和二進制文件的方法的構造函數。我如何編寫一個junit測試來測試這個類?使用junit測試從文本和二進制文件讀取以及寫入文本和二進制文件

看到下面的代碼:

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.PrintWriter; 
import java.util.Scanner; 

public class Course { 
//instance variables 
private String courseID; 
private String courseName; 
private int numberOfCredits; 
private String departmentID; 

public Course(String courseID,String courseName, int numberOfCredits, String departmentID){ 
    //constructor 
    this.courseID=courseID; 
    this.courseName=courseName; 
    this.numberOfCredits=numberOfCredits; 
    this.departmentID=departmentID; 
} 

public Course(Scanner inputFile)throws Exception{ 
    //constructor, read data from text file 
    try{ 
     courseID=inputFile.nextLine(); 
     courseName=inputFile.next(); 
     numberOfCredits=inputFile.nextInt(); 
     departmentID=inputFile.next(); 
    } 
    catch(Exception e){ 
     throw e; 
    } 

} 

public Course (DataInputStream binFile)throws Exception{ 
    //constructor reads from binary file and assign values to variables 
    try{ 
    courseID=binFile.readUTF(); 
    courseName=binFile.readUTF(); 
    numberOfCredits=binFile.readInt(); 
    departmentID=binFile.readUTF(); 
    } 
    catch(Exception e){ 
     throw e; 
    } 
} 
public void saveToTextFile(PrintWriter file){ 
    //prints to text file 
    file.printf(" %s %s %d %s ", courseID, courseName, numberOfCredits, departmentID); 
} 
public void saveToBin(DataOutputStream binFile)throws Exception{ 
    //saves information to binary file 
    binFile.writeUTF(courseID); 
    binFile.writeUTF(courseName); 
    binFile.writeInt(numberOfCredits); 
    binFile.writeUTF(departmentID); 
} 



public String toString(){ 
    //setup string for course display 
    String info=courseID + " " + courseName+ " "+ numberOfCredits+" "+ departmentID; 
    return info; 
} 

//getters and setters 
public String getCourseName() { 
    return courseName; 
} 

public void setCourseName(String courseName) { 
    this.courseName = courseName; 
} 

public int getNumberOfCredits() { 
    return numberOfCredits; 
} 

public void setNumberOfCredits(int numberOfCredits) { 
    this.numberOfCredits = numberOfCredits; 
} 

public String getDepartmentID() { 
    return departmentID; 
} 

public void setDepartmentID(String departmentID) { 
    this.departmentID = departmentID; 
} 

public String getCourseID() { 
    return courseID; 
} 

}

回答

1

當你測試你的構造通常只需要以下條件:

  • 確保創建的對象包含預期的值(即你傳遞的值,或從一些計算結果進行數據對他們)
  • 裝入對象中的數據相匹配的文件中(或者其他的InputStream,如果你不希望使用在測試中的實際文件)
  • ,將拋出異常無效的輸入

除此之外,構造函數沒有太多要做。在你的第一個構造函數中,它只是簡單地賦值(不用做任何磁盤I/O),所以我不傾向於測試那些構造函數,因爲你真正驗證的是Java中的=運算符工作,我們知道是的。

所以,我只會編寫覆蓋上述第二個構造函數的測試。

+0

測試保存到文本和二進制文件怎麼樣? – trs

+0

取決於你的情況,但是當測試保存/加載時,我通常會測試以確保(1)我可以保存而不會拋出錯誤,(2)我可以加載由我自己的代碼保存的文件,加載到生成的Java對象中的值顯示正確且有效。它不必很複雜 - 您只需確保從應用程序到磁盤,然後返回到應用程序的往返行程就能保持數據的形式,從一次運行到另一次運行都保持一致。所以當保存一個整數值'5'時,當我從磁盤加載它時,它最好仍然等於'5'。 – jefflunt

1

幸運的是,你有沒有實際需要文件 - 這樣你就可以在PrintWriter寫入StringWriter傳遞和DataInputStream包裝一ByteArrayInputStream並在內存中測試所有內容。

另一種選擇是有資源,在您的測試項目,預計輸出 - 總是內存,但隨後覈對這些「黃金」的文件,期待你或許應該加載使用Class.getResource而非FileInputStream (以避免有任何文件系統依賴)。

+0

你能否詳細說明我是這個新手 – trs

+0

@trs:我增加了一些信息,但是如果你說哪一位有問題,它會有所幫助。 –