抛出异常的单元测试

时间:2016-10-10 19:52:26

标签: java spring unit-testing

我有一个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);
}

但是,这并没有测试实际抛出异常的权利。

2 个答案:

答案 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
}

如上面的代码段所示,您还可以测试异常的各种属性,例如其消息。