Форсирование JAXBException в тесте JUnit - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь создать тест исключения 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.

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

1 Ответ

0 голосов
/ 06 марта 2019

Вы ловите и глотаете исключение, т.е. 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 в сигнатуре метода, тогда ваш контрольный пример либо избыточен, либо обращается к неправильному типу исключения.

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