我有一个Spring Boot应用程序,我在Service层中有方法,如:
public List<PlacementDTO> getPlacementById(final int id) throws MctException {
List<PlacementDTO> placementList;
try {
placementList = placementDao.getPlacementById(id);
} catch (SQLException ex) {
throw new MctException("Error retrieving placement data", ex);
}
return placementList;
}
单元测试抛出MctException的最佳方法是什么?我试过了:
@Test(expected = MctException.class)
public void testGetPlacementByIdFail() throws MctException, SQLException {
when(placementDao.getPlacementById(15)).thenThrow(MctException.class);
placementService.getPlacementById(15);
}
但是,这并没有测试实际抛出异常的权利。
答案 0 :(得分:1)
我认为您必须存根placementDao.getPlacementById(15)
来调用SQLException
而不是MctException
,如下所示:
@Test(expected = MctException.class)
public void testGetPlacementByIdFail() throws MctException, SQLException {
when(placementDao.getPlacementById(15)).thenThrow(SQLException.class);
placementService.getPlacementById(15);
}
这样,当您调用服务方法placementService.getPlacementById(15);
时,您知道MctException
将封装SQLException
,因此您的测试可能会引发MctException
异常。
答案 1 :(得分:1)
您可能想要试用Junit的ExepctionException规则功能。与预期的异常注释相比,这将允许在单元测试中验证异常处理的更大粒度。
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void testGetPlacementByIdFail(){
thrown.expect(MctException.class);
thrown.expectMessage("Error retrieving placement data");
//Test code that throws the exception
}
如上面的代码段所示,您还可以测试异常的各种属性,例如其消息。