Принудительное исключение JAXBException в тесте JUnit

Я пытаюсь сделать тест исключения JUnit для метода десортировки.

Это мой метод неупорядочения (примечание: я возвращаю строку из-за обычного тестирования неупорядоченного тестирования с ожидаемой строкой).

public String UnMarshalling(String FILE)
{
    ArrayList<Player> playerList = new ArrayList<Player>();
    try {
        JAXBContext context = JAXBContext.newInstance(Match.class);
        Unmarshaller um = context.createUnmarshaller();
        Match Match2 = (Match) um.unmarshal(new InputStreamReader(new FileInputStream(FILE), StandardCharsets.UTF_8));
        playerList = Match2.playerList;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (JAXBException e) {
        e.printStackTrace();
    }

    return playerList.toString();
}

Вот тесты для этого метода.

@Test
public void unMarshallingTest() {
    assertTrue(marshalling.UnMarshalling(matchxml).contains("Petras"));
}

@Test(expected=JAXBException.class)
public void marshallingTestException()
{
        marshalling.UnMarshalling(matchbrokenxml);    
}

Чего я пытаюсь добиться, так это отправить сломанный xml, например, с неправильной версией xml и получить JAXBException.

До сих пор я искал в Интернете пример, но ничего не нашел. Любые предложения о том, как этого добиться?

Итак, вы не получаете ожидаемое исключение? Если matchbrokenxml указывает на файл, содержащий мусор, я ожидаю, что это сработает. Каково содержимое вашего файла?

BretC 06.03.2019 18:21

файл xml пуст, и я получаю javax.xml.bind.UnmarshalException

PetriuxD Nezinau 06.03.2019 18:23

Итак, я должен изменить ожидаемое исключение на UnmarshalException?

PetriuxD Nezinau 06.03.2019 18:34

Есть еще 20 исключений, связанных с этим unmarshaException.

PetriuxD Nezinau 06.03.2019 18:35

Как мне выбросить это исключение? @glytching

PetriuxD Nezinau 06.03.2019 18:38

Итак, я думаю, что я мог бы это сделать. Спасибо за помощь, ребята!

PetriuxD Nezinau 06.03.2019 18:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
1 220
1

Ответы 1

Вы ловите и проглатываете исключение, т.е. UnMarshalling() никогда не выдает JAXBException (или любой его подкласс).

Это будет работать:

public String UnMarshalling(String FILE) throws JAXBException {
    ArrayList<Player> playerList = new ArrayList<Player>();
    try {
        JAXBContext context = JAXBContext.newInstance(Match.class);
        Unmarshaller um = context.createUnmarshaller();
        Match Match2 = (Match) um.unmarshal(new InputStreamReader(new FileInputStream(FILE), StandardCharsets.UTF_8));
        playerList = Match2.playerList;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } 

    return playerList.toString();
}


@Test(expected=UnmarshalException.class)
public void marshallingTestException() {

    marshalling.UnMarshalling(matchbrokenxml);

}

Основное изменение здесь — удаление предложения catch для JAXBException и добавление throws JAXBException в объявление метода.

Ваш тест сильно предполагает, что JAXBException является частью общедоступного API для этого метода, и в этом случае имеет смысл объявить метод для выбрасывания JAXBEception. С другой стороны, если вы действительно не хотите или не нуждаетесь в JAXBException в сигнатуре метода, тогда ваш тестовый пример либо избыточен, либо обращается к неправильному типу исключения.

Другие вопросы по теме