[英]Junit Code coverage for SocketTimeout exception inside ResourceAccessException
[英]java junit exception hadling for code coverage
我是java,Junit和jacoco的新手。 我正在做如下的異常處理。 我正在捕獲Exception類,以防該方法拋出之前錯過的任何其他異常。
private void myMethod1() throws MyCustomException {
....
try {
..... straight JDBC calls for select, insert, update operations ....
} catch (SQLException sqEx) {
logger.error(....);
new MyCustomException(.....);
} catch (RuntimeException rEx) {
logger.error(....);
new MyCustomException(.....);
} catch (Exception ex) {
logger.error(....);
new MyCustomException(.....);
}
}
在Junit測試中,嘗試下面。 當我有運行時任何異常時,我拋出的總是會運行RuntimeException catch塊本身,除非我拋出異常。 我可以嘗試其他檢查異常,因此它進入Exception catch塊。 由於這個原因,我無法獲得所需的代碼覆蓋率。
private void testMyMethod1() {
....
try {
.....
when(...).thenThrow(new SocketException());
spy.myMethod1();
} catch (SQLException sqEx) {
assertTrue(false);
} catch (RuntimeException rEx) {
assertTrue(false)
} catch (Exception ex) {
assertTrue(true);
}
}
感謝您的幫助。
在thenThrow你已經拋出了套接字異常,但你正試圖捕獲一些其他異常,如SQLException。 如果拋出的異常不是SQLException的子代,那么它將不會進入該塊。
另外請確保在().. thenThrow()語句中通過調試創建正確的異常。有時候創建不適當的異常會導致問題。
一些事情......如果你的myMethod1()
不在同一個java類中,你就無法在單獨的單元測試類中測試私有方法。 最好使myMethod1()
包受到保護。 在您的測試類中,最好不要在其中包含任何try catch或if語句。 您必須為每個測試用例制作單獨的測試方法,而不是一個一個。 您可以利用@Rule
或@expected
注釋。 我建議這樣做......
@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesSQLException(){
doThrow(SQLException.class).when(...);
Foo foo = new Foo();
foo.myMethod1();
}
@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesRuntimeException(){
doThrow(RuntimeException.class).when(...);
Foo foo = new Foo();
foo.myMethod1();
}
@Test(expected = MyCustomException.class)
public void testMyMethod1_handlesException(){
doThrow(Exception.class).when(...);
Foo foo = new Foo();
foo.myMethod1();
}
在JUnit 5中,可能的方法是:
@ParameterizedTest
@ValueSource(classes = {
SQLException.class,
RunTimeException.class,
Exception.class
})
void methodWrapsException(Exception toBeWrapped) {
Foo foo = new Foo(...);
doThrow(toBeWrapped).when(...);
assertThrows(MyCustomException.class, () -> foo.myMethod1());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.