我有以下负面测试代码(需要失败并引发异常):
@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子句捕获的。 为什么会在这里发生?
谢谢!
答案 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());
}