2013-09-24 29 views
0

我正在尝试为类ErParser中的方法setTrailer()编写测试用例。 setTrailer()有try-catch子句,并且在其中一个catch子句中,它捕获NullPointerException。我试图为setTrailer()引发并捕获NullPointerException的情况编写Junit测试,但测试用例仍然失败。是否因为我已经在方法本身中发现了异常?我应该在测试用例中捕捉异常吗?Junit已经有try-catch子句的方法的测试用例

测试案例:ERParser类内

public class TestERParser { 
    @Test(expected=NullPointerException.class) 
    public void nullSetTrailer() { 
     ERParser recCurrParse = new ERParser(); 
     recCurrParse.setTrailer(null); 
    } 
} 

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(); 
    } 
} 
} 
+1

您不应该捕获NPE;你应该完全避免它。检查空值并且没有NPE异常。 –

+0

通常情况下,调用者会抛出并捕获异常,这是执行异常的最佳方式,异常可能是指外部的某种情况;想象除0操作被处理,而不是得到错误,它返回0或1,或任何其他值,但你想期待这种特殊情况。有了Junit,你无法在那里做任何事情,但期待对该方法的调用。如果你抛出任何异常,那么你可以期待异常。 – porfiriopartida

+0

我不认为你完全理解如何从IOException中恢复,只是说。 – Woot4Moo

回答

1

正如你怀疑你正在捕捉代码中的NPE并且它没有被传播。如果您希望用户能够捕获此异常,则应该删除此代码并将您的方法抛出到适当的类中。

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(); 
} 

当你的代码现在抛出一个checked异常,你将需要稍微更新Junit的方法,抓检查异常

@Test(expected=NullPointerException.class) 
    public void nullSetTrailer() throws Exception { 
     ERParser recCurrParse = new ERParser(); 
     recCurrParse.setTrailer(null); 
    } 
1

我们可以争论此catch块是否表示异常进行处理。我会争辩说,仅仅打印堆栈跟踪没有处理任何事情。向方法签名添加一个throws子句可能会更好,并让客户决定如何处理异常。

如果这种方法是这样写的,那么由您来测试它是否写入。如果这是第三方图书馆,你不会有选择。

编写引发异常的测试;成功意味着trailerRecord设置为null

你的代码有另一个缺陷:关闭finally块中的流。您有可能无法像写入那样正确关闭输入流。

0

在你的测试用例都期待一个NullPointerException类。如果你抓住它,调用者类将不会得到它。因此,您可以删除try/catch块,也可以在打印堆栈跟踪后重新抛出异常:

catch (NullPointerException exception) { 
     exception.printStackTrace(); 
     throw new NullPointerException(); 
    } 
+2

通常你会想重新抛出现有的异常,而不是创建一个新的异常。 – Dev