Невозможно проверить исключение с помощью junit - PullRequest
3 голосов
/ 11 февраля 2011

У меня есть метод, который содержит блок try-catch, и я не знаю, как сделать мой тест успешным ...

Вот мой код:

public class ClassToTest {
    public void loadFileContent() {
        try {
            InputStream fileStream = fileLoader.loadFileContent();
            fileContentReader = new BufferedReader(new InputStreamReader(fileStream));
        } catch(CustomException ce) {
            logger.log(Level.SEVERE, "Error message")
        }
    }
}

public class TestClassToTest {
    @Test
    (expected = CustomException.class)
    public void testCustomException() throws Exception {
        loadFileContent();
    }
}

Единственное, что я хочу сделать, когда выдается исключение, это записать его в журнал, и все это прекрасно работает, однако, как я могу создать тест, который показывает, что оно работает?

Я пытался захватить вывод консоли и

assertTrue(consoleOutput.contains("logMessgae") 

и это работало до тех пор, пока я выполнял только этот конкретный тестовый пример, но он не работал, когда я запускал его в моем наборе тестов.

Ответы [ 4 ]

2 голосов
/ 11 февраля 2011

Контракт метода заключается в том, чтобы перехватить CustomException и записать «Сообщение об ошибке» во внешний компонент: регистратор. Таким образом, вы должны создать фиктивный регистратор, передать его экземпляру ClassToTest, протестировать метод и убедиться, что фиктивный регистратор был вызван с правильными аргументами.

Я лично использую EasyMock (и его расширение "classextension") для макетирования конкретных классов, но есть и другие фиктивные фреймворки. Прочитайте http://easymock.org/EasyMock3_0_Documentation.html для получения информации о EasyMock и насмешках в целом.

0 голосов
/ 11 февраля 2011

Я думаю, что правильный способ сделать это - передать ваш регистратор в ваш класс, и если вы используете фальшивый фреймворк, такой как Mockito, вы можете проверить свой регистратор с помощью verify :

ClassToTest myInstance = new ClassToTest(myLogger);

// then, in your unit test
verify(myLogger).log("my log message")

ключ здесь передает ваши зависимости, чтобы вы могли затем проверить взаимодействие с ними.

0 голосов
/ 11 февраля 2011

Если вы пытаетесь проверить, что CustomException генерируется при определенных условиях, вам следует протестировать код, который выдает исключение, а не код, который его перехватывает.В вашем примере, я предполагаю, что ваш неопределенный «fileLoader» - это то, что вы ожидаете выбросить исключение?

Если вы пытаетесь проверить, что исключение поймано и все продолжает работать гладкозатем вам нужно перепроектировать ClassToTest, чтобы можно было внедрить фиктивную реализацию класса, вызывающего исключение.Эта фиктивная реализация всегда выдает исключение.Затем вы можете запустить ClassToTest в своем тесте и установить любое условие, указывающее, что оно обработало исключение правильно.

0 голосов
/ 11 февраля 2011

Ваш код не тестируется без наличия фиктивного файла.Вы можете сделать этот код более тестируемым, смоделировав внешние зависимости и используя внедрение зависимостей (т.е. через guice ).

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