2013-11-19 4 views
0

Я пишу тест JUnit/Mockito, где ожидается, что будет выбрано исключение. Конечно, я могу это сделать:Как проверить детали исключений, брошенных в тестах JUnit?

@Test(expected=IllegalArgumentException.class) 

Но это не позволяет мне делать что-либо еще после его броска. Так что я думал, может быть что-то подобное:

Exception actualEx = null; 
try { 
    // Act 
    sut.doStuff(); 
} catch (final Exception ex) { 
    actualEx = ex; 
} 
// Assert 
assertTrue(IllegalArgumentException.class.equals(actualEx.getClass())); 
// ... perhaps verify the exception details 
verifyNoMoreInteractions(mockObject); 

Это кажется довольно некрасиво и чувствует, как он может быть улучшен - есть лучший путь?

+3

Вы пробовали правило ExpectedException? http://alexruiz.developerblogs.com/?p=1530 – luanjot

+0

или [catch-exception] (https://code.google.com/p/catch-exception/), слишком плохо, однако они используют FEST-Assert (почти мертвый) вместо AssertJ – Brice

+0

@Brice Спасибо, но я предпочел бы избегать добавления библиотек, если я могу помочь ... –

ответ

2

Я думаю, что вы должны быть последовательны во всем своем проекте - хотя есть три или четыре разных способа решить эту проблему, вы абсолютно должны не попытаться использовать их все.

Поскольку механизм ExpectedException является самым мощным и универсальным, я бы рекомендовал вам научиться его использовать. Его преимущества включают следующее.

  • Легко проверить как тип брошенного исключения, так и его сообщение.
  • Вы можете выполнить более сложное сопоставление по исключению, если вам нужно.
  • Вы можете точно проверить, какая строка теста выдает исключение, путем помещения вызова expect непосредственно перед строкой, в которой вы ожидаете выбросить исключение.

С риском звучать как реклама шампуня - теперь, когда я использовал ExpectedException, я бы больше ничего не использовал!

1

Просто добавьте сюда. Я согласен со статьей Стефана, и это хорошие ресурсы. Вот рекомендации, которые я придерживаюсь.

  1. я использую только @Test(expected=...), если есть только один вызов метода в тесте, и это метод при тестировании. Это из-за следующего ... что, если у вас есть @Test(expect=NullPointerException.class), и у вас есть ошибка где-то в настройке теста, который выдает это исключение. Тест пройдет, никогда не вызывая тестируемый метод.

  2. Итак, во всех остальных случаях я использую правило ExpectedException с expect непосредственно перед вызовом тестируемого метода. Таким образом, если исключение выбрано в коде перед вызовом метода, тест завершится с ошибкой.

Я никогда не использую улов/не механизм, потому что это слишком просто для кого-то неопытный, чтобы удалить fail и это позволило бы тест пройти ошибочно. Если мне нужно выполнить дополнительную проверку, я по-прежнему использую ExpectedException и реконструирую исключение в блоке catch после того, как сделаю какую-либо дополнительную проверку.

Смежные вопросы