Весна: не удается поймать выброшенное исключение - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующий отрицательный тестовый код (должен произойти сбой и выдать исключение):

@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 голосов
/ 17 октября 2018

Решение, которое сработало для меня, выглядит следующим образом:

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());
        }
0 голосов
/ 15 октября 2018

Дело в том, что 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);
    }
}

Надеюсь, это поможет!

0 голосов
/ 15 октября 2018

Чтобы проверить исключение, вы можете использовать этот код, я думаю, что он чище и избегайте использования try / catch внутри вашего теста

@Test(expected = HttpServerErrorException.class) 
public void testInventoryControllerGetNonExistingRegion() {
    final String name = "ME_2";
    RegionConfiguration refRegionConfiguration = prepareReferenceObject(name);
    inventoryRegionController.get(null,name);
}
0 голосов
/ 15 октября 2018

EntityDoesNotExistException является исключением на стороне сервера .
Когда вы вызываете свой код через REST, исключение на стороне сервера преобразуется в строку JSON, возвращаемую на стороне клиента какHTTP-ответ с этой строкой JSON в теле, а затем преобразованный обратно в (другое) исключение на стороне клиента , в зависимости от используемой вами структуры REST.(В вашем случае: HttpServerErrorException).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...