2011-09-19 126 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:我增加了一些信息,但是如果你说哪一位有问题,它会有所帮助。 –