首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring:未能捕获抛出的异常

Spring:未能捕获抛出的异常
EN

Stack Overflow用户
提问于 2018-10-15 12:20:27
回答 4查看 183关注 0票数 0

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

代码语言:javascript
运行
复制
@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对象。

代码语言:javascript
运行
复制
@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()方法确实根据需要抛出异常(我有一个断点并验证了)!但我的测试没抓到。这是因为我得到的是

代码语言:javascript
运行
复制
HttpServerErrorException: 500 null

这个异常实际上是被catch子句捕获的。为什么这里会发生这种事?

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2018-10-15 12:32:04

问题是Spring为你做了一些艰苦的工作。在这种情况下,您的异常将被HTTP错误所包围,因为REST只是一种方法。由于您没有任何关于异常映射的配置,服务器将将其转换为HTTP500-Server错误。我认为你做这个测试最好的方法是

代码语言:javascript
运行
复制
@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);
    }
}

希望能帮上忙!

票数 2
EN

Stack Overflow用户

发布于 2018-10-15 12:25:54

EntityDoesNotExistException是服务器端的异常()。

当您通过REST调用代码时,服务器端的异常将被转换为JSON字符串,返回到客户端,作为具有正文中的JSON字符串的HTTP响应,然后根据所使用的REST框架在客户端上转换回(不同的)异常。(在你的例子中:HttpServerErrorException)。

票数 1
EN

Stack Overflow用户

发布于 2018-10-15 12:59:59

为了验证异常,您可以使用以下代码,我认为它更简洁,并且避免在测试中使用try/catch。

代码语言:javascript
运行
复制
@Test(expected = HttpServerErrorException.class) 
public void testInventoryControllerGetNonExistingRegion() {
    final String name = "ME_2";
    RegionConfiguration refRegionConfiguration = prepareReferenceObject(name);
    inventoryRegionController.get(null,name);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52816679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档