2013-07-30 170 views
0

我有一个处理异常的方法:测试 “处理的异常” 的JUnit

public boolean exampleMethod(){ 

    try{ 
     Integer temp=null; 
     temp.equals(null); 
     return 
     }catch(Exception e){ 
     e.printStackTrace(); 
     } 
    } 

我想测试

public void test_exampleMethod(){} 

我已经试过

@Rule 
public ExpectedException expectedException=ExpectedException.none(); 

public void test_exampleMethod(){ 
    expectedException.expect(JsonParseException.class); 
    exampleMethod(); 
} 

但是,这并不因为异常是在里面处理的。

我也试过

@Test(expected=JsonParseException.class) 

但同样的问题......在处理异常

我知道我可以做

assertTrue(if(exampleMethod())) 

,但它仍然会打印出堆栈跟踪到日志。我宁愿干净的日志...任何建议?

+0

你的例子并不完整,你需要在你的方法结束时返回声明 – AlexWien

回答

1

你不能测试一种方法在内部做什么。这是完全隐藏的(除非有副作用,外部可见)。

该测试可以检查对于特定的输入该方法返回预期的输出。但是你不能检查,这是如何完成的。所以你无法检测是否有你已经处理的异常。

因此:要么不处理异常(让测试捕获异常),要么返回一个特殊值来告诉您有关异常。

无论如何,我希望你真正的异常处理比你的例子更明智。

+0

谢谢。我希望有一种方法可以看到它们。唉,我会忍受肮脏的日志。 是的,这些都是我能想到的异常处理示例的“简单”,而不是真正的代码。 – user2174646

1

如果该方法没有抛出异常,你不能指望得到一个!

下面一个例子,如何写一个JUnit测试用于抛出异常的方法:

class Parser { 
    public void parseValue(String number) { 
     return Integer.parseInt(number); 
    } 
} 

普通测试用例

public void testParseValueOK() { 
    Parser parser = new Parser(); 
    assertTrue(23, parser.parseValue("23"));  
} 

测试用例例外

public void testParseValueException() { 
    Parser parser = new Parser(); 
    try { 
     int value = parser.parseValue("notANumber"); 
     fail("Expected a NumberFormatException"); 
    } catch (NumberFormatException ex) { 
     // as expected got exception 
    } 
}