春季:未能捕获引发的异常

时间:2018-10-15 12:20:28

标签: java spring rest exception

我有以下负面测试代码(需要失败并引发异常):

@Test
public void testInventoryControllerGetNonExistingRegion() {

    final String name = "ME_2";
    RegionConfiguration refRegionConfiguration = prepareReferenceObject(name);

    try(
        inventoryRegionController.get(null,name);
    } catch (EntityDoesNotExistException e){

        //report something...
    }
}

该测试调用以下方法get(),并且应该抛出EntityDoesNotExistException对象。

@ApiOperation(value = "Get a region")
@RequestMapping(value = "regions/{" + REGION + "}", method = RequestMethod.GET)
public RegionConfiguration get(@RequestHeader(value = AUTHORIZATION_HEADER, defaultValue = "Bearer {{JWT}}") String authorization,
                               @PathVariable(REGION) String regionName) throws EntityDoesNotExistException {

    InventoryRegionEntity inventoryRegionEntity = null;
    inventoryRegionEntity = RegionInventoryService.find(regionName);

    if(null != inventoryRegionEntity)
        return RegionConfigurationMapper.mapInventoryRegionEntity(inventoryRegionEntity);
    else
        throw new EntityDoesNotExistException(InventoryRegionEntity.class, regionName);
}

get()方法会抛出异常(我有一个断点并已验证)! 但是我的测试从未成功。那是因为我得到的是

HttpServerErrorException: 500 null

此异常实际上是由catch子句捕获的。 为什么会在这里发生?

谢谢!

4 个答案:

答案 0 :(得分:2)

问题是Spring为您完成了一些繁琐的工作。在这种特殊情况下,您的异常将被封装为HTTP错误,因为REST只是一种方法。由于您没有有关异常映射的任何配置,因此服务器会将其转换为HTTP 500-服务器错误。我认为最好的测试方法是

@Test
public void testInventoryControllerGetNonExistingRegion() {
    final String name = "ME_2";
    RegionConfiguration refRegionConfiguration = prepareReferenceObject(name);

    try(
        inventoryRegionController.get(null,name);
        Assert.fail(); // don't forget to fail your test in no exception thrown
    } catch (HttpServerErrorException e){
        Assert.notNull(e);
        Assert.assertTrue(e.getCause() instanceof EntityDoesNotExistException);
    }
}

希望有帮助!

答案 1 :(得分:1)

EntityDoesNotExistException是服务器端的例外
当您通过REST调用代码时,服务器端的异常将转换为JSON字符串,并以HTTP响应的形式返回到客户端,主体中带有该JSON字符串,然后转换回(不同的)异常在客户端上,具体取决于您使用的REST框架。 (在您的情况下:HttpServerErrorException)。

答案 2 :(得分:0)

为验证您可以使用此代码的异常,我认为这更干净,请避免在测试中使用try / catch

@Test(expected = HttpServerErrorException.class) 
public void testInventoryControllerGetNonExistingRegion() {
    final String name = "ME_2";
    RegionConfiguration refRegionConfiguration = prepareReferenceObject(name);
    inventoryRegionController.get(null,name);
}

答案 3 :(得分:0)

对我有用的解决方案如下:

try{

   //something...

}catch(HttpClientErrorException | HttpServerErrorException e) {

            ObjectMapper objectMapper = new ObjectMapper();
            Context context = null;
            try {
                context = objectMapper.readValue(e.getResponseBodyAsString(), Context.class);
            } catch (IOException ioExc) {
                ioExc.printStackTrace();
            }
            assertEquals("Failed on ", context.getType(), ExceptionFromServer.class.getTypeName());
        }