我正在尝试为类ErParser中的方法setTrailer()
编写测试用例。 setTrailer()
具有try-catch子句,并且在其中一个catch子句中,它捕获NullPointerException
。我正在尝试为setTrailer()
抛出并捕获NullPointerException
的情况编写Junit测试,但测试用例仍然失败。是因为我已经在方法本身中捕获了异常吗?我应该在测试用例中捕获异常吗?
测试用例:
public class TestERParser {
@Test(expected=NullPointerException.class)
public void nullSetTrailer() {
ERParser recCurrParse = new ERParser();
recCurrParse.setTrailer(null);
}
}
ERParser类中的setTrailer()方法:
public class ERParser {
private static final String TRAILER_E = "GRAND TOTAL";
private static final String TRAILER_R = "TRAILER";
public String trailerRecord;
/**
* Constructs an ERParser object.
*/
public ERParser() {
this.trailerRecord = null;
this.trailerVals = null;
}
/**
* Populates the trailerRecord field with the summary (trailer) record of the input file.
* @param file Input file
* @throws NullPointerException, FileNotFoundException, IOException
*/
public void setTrailer(File file) {
try {
FileReader fReader = new FileReader(file);
BufferedReader bReader = new BufferedReader (fReader);
String currLine = new String();
readLoop:
while (bReader.ready()) {
currLine = bReader.readLine();
if (currLine.contains(TRAILER_E) || currLine.contains(TRAILER_R)) {
break readLoop;
}
}
this.trailerRecord = currLine.trim();
System.out.println("From setTrailer(): " + this.trailerRecord);
fReader.close();
bReader.close();
} catch (NullPointerException exception) {
exception.printStackTrace();
} catch (FileNotFoundException exception) {
exception.printStackTrace();
} catch (IOException exception) {
exception.printStackTrace();
}
}
}
答案 0 :(得分:1)
我们可以争论这个catch块是否意味着处理了异常。我认为仅仅打印堆栈跟踪不会处理任何事情。最好在方法签名中添加throws子句,让客户决定如何处理异常。
如果方法是以这种方式编写的,那么由你自己来测试它。如果这是第三方图书馆,你将无法选择。
编写抛出异常的测试;成功意味着trailerRecord
设置为null
。
您的代码还有另一个缺陷:关闭finally块中的流。您可能无法正确关闭输入流。
答案 1 :(得分:1)
正如您所怀疑的那样,您正在捕获代码中的NPE并且它没有被传播。如果您希望用户捕获此异常,则应删除此代码并使用throws将方法装饰到适当的类中。
public void setTrailer(File file) throws Exception {
FileReader fReader = new FileReader(file);
BufferedReader bReader = new BufferedReader (fReader);
String currLine = new String();
readLoop:
while (bReader.ready()) {
currLine = bReader.readLine();
if (currLine.contains(TRAILER_E) || currLine.contains(TRAILER_R)) {
break readLoop;
}
}
this.trailerRecord = currLine.trim();
System.out.println("From setTrailer(): " + this.trailerRecord);
fReader.close();
bReader.close();
}
由于您的代码现在抛出一个已检查的异常,您需要稍微更新您的Junit方法,以捕获已检查的异常
@Test(expected=NullPointerException.class)
public void nullSetTrailer() throws Exception {
ERParser recCurrParse = new ERParser();
recCurrParse.setTrailer(null);
}
答案 2 :(得分:0)
在您的测试用例中期待NullPointerException类。如果你抓住它,调用者类将无法获得它。因此,您可以删除try / catch块,也可以在打印stacktrace后重新抛出异常:
catch (NullPointerException exception) {
exception.printStackTrace();
throw new NullPointerException();
}