Как проверить проглоченное исключение - PullRequest
1 голос
/ 27 марта 2012

Я потратил некоторое время на поиски способа решения моей проблемы, но безуспешно! Вот моя проблема: у меня есть код, который делает следующее:

public void DoSomething(){
    try{
       DoStuffThatCanThrowException();
    }catch(Exception e){
       // Do nothing...
    }
}

Как видите, блок try catch поглощает все исключения, которые могут быть выброшены в DoStuffThatCanThrowException(). Я очень стараюсь придумать способ написания модульного теста, который в основном гарантирует, что в DoStuffThatCanThrowException() не будет исключений. Сложность в том, что я не могу изменить ни блок try catch, ни метод DoStuffThatCanThrowException().

Любые советы высоко ценятся.

EDIT Одна важная деталь, которую я забыл упомянуть, я не могу назвать DoStuffThatCanThrowException напрямую, так как она internal и поэтому не видна из внешнего мира.

Ответы [ 4 ]

3 голосов
/ 27 марта 2012

Разве вы не можете просто вызвать DoStuffThatCanThrowException из самого модульного теста, поэтому не будете окружены try ... catch вообще?

Редактировать : Только что увидел, что ваш метод является внутренним. Я бы посоветовал для вашего теста сделать публичный метод, который оборачивает его. Таким образом, вы можете временно проверить вещи. Если вы уверены, что метод не может завершиться неудачей, вам больше не понадобится попытка ... поймать в первую очередь.

2 голосов
/ 27 марта 2012

Извините за неразбериху с ответом, может рефлексия поможет вам покопаться?

ClassContainingInternalMethod cl = new ClassContainingInternalMethod ();

//any private or internal method you want here.
MethodInfo dynMethod = 
cl.GetType().GetMethod("DoSomeStuff", BindingFlags.NonPublic | BindingFlags.Instance);

dynMethod.Invoke(cl, new object[] {});
1 голос
/ 27 марта 2012

Можете ли вы позвонить DoStuffThatCanThrowException() напрямую? Если нет, создайте подкласс исходного класса, который содержит этот блок try catch, и вызовите его оттуда без блока catch.

class ClassUnderTest extends OriginalClass
{
    @Override
    public void functionToTest()
    {
             DoStuffThatCanThrowException()
    }

}

Кроме того, тестирование на отсутствие исключений затруднительно. Вам нужно найти все возможные исключения и проверить их. Даже тогда все, что вы говорите, это «дайте эти тесты, исключений не было». Это менее убедительно, чем сказать «исключения не будут выброшены», но обычно достаточно хорошо.

0 голосов
/ 27 марта 2012

Добавьте положительный результат сразу после вызова на DoStuffThatCanThrowException() в блоке try.Если возникает исключение, то assert не будет выполнено.Или добавьте отрицательное утверждение в блоке catch.Не уверен, что это отвечает на ваш вопрос;это не очень понятно.

...