我有以下负面测试代码(需要失败并抛出异常):
@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子句捕获的。为什么这里会发生这种事?
谢谢!
发布于 2018-10-15 12:32:04
问题是Spring为你做了一些艰苦的工作。在这种情况下,您的异常将被HTTP错误所包围,因为REST只是一种方法。由于您没有任何关于异常映射的配置,服务器将将其转换为HTTP500-Server错误。我认为你做这个测试最好的方法是
@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);
}
}希望能帮上忙!
发布于 2018-10-15 12:25:54
EntityDoesNotExistException是服务器端的异常()。
当您通过REST调用代码时,服务器端的异常将被转换为JSON字符串,返回到客户端,作为具有正文中的JSON字符串的HTTP响应,然后根据所使用的REST框架在客户端上转换回(不同的)异常。(在你的例子中:HttpServerErrorException)。
发布于 2018-10-15 12:59:59
为了验证异常,您可以使用以下代码,我认为它更简洁,并且避免在测试中使用try/catch。
@Test(expected = HttpServerErrorException.class)
public void testInventoryControllerGetNonExistingRegion() {
final String name = "ME_2";
RegionConfiguration refRegionConfiguration = prepareReferenceObject(name);
inventoryRegionController.get(null,name);
}https://stackoverflow.com/questions/52816679
复制相似问题