2013-06-16 3 views
0

Итак, я работаю над проектом, и мне нужно проверить, не улавливает ли мой метод ParseException, когда это происходит. Вот как метод, который я должен проверить выглядит следующим образом:Как проверить JUnit ParseException

public void convertToModel(final BuildStone bs, final TextBuildStone model) { 
    try { 
     model.setBeginDateRange(ProjectDateConverter.projectDateToCalendarDefaultMin(bs.getFromDate(), true)); 
    } catch (final ParseException e) { 
     SystemContext.getLogger().warning(
       this, 
       "treatGeneralData", 
       "Date not converted: {0}, BeginDate set at MinDate", 
       bs.getFromDate()); 
     model.setBeginDateRange(CalendarConstants.getMinDate()); 
    } 

Так что я должен проверить, когда этот метод ловит ParseException.

Метод, который бросает ParseException является projectDateToCalendarDefaultMin, вот код этого метода:

public static Calendar projectDateToCalendarDefaultMin(final BigDecimal dateValue, final boolean useMinDate) throws ParseException { 
    return dateValue == null ? ProjectDateConverter.projectDateStringToCalendar(null, useMinDate, false) : ProjectDateConverter 
      .projectDateStringToCalendar(dateValue.toString(), useMinDate, false); 

Метод, который бросает ParseException называется projectDateStringToCalendar. Вот как это выглядит как:

private static Calendar projectDateStringToCalendar(final String dateValue, final boolean useMinDate, final boolean useMaxDate) 
     throws ParseException { 
    if (useMinDate && useMaxDate) { 
     throw new IllegalArgumentException("useMinDate and useMaxDate may not be set as true "); 
    } 
    if (StringUtils.isEmpty(dateValue)) { 
     if (useMinDate) { 
      return CalendarConstants.getMinDate(); 
     } else if (useMaxDate) { 
      return CalendarConstants.getMaxDate(); 
     } else { 
      return null; 
     } 
    } 
... 
final GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTime(new SimpleDateFormat("yyyyMMdd").parse(dateValue)); 

    return gc; 
} 

Так вот где ParseException наконец брошен, в методе parse(). ParseException от text.parse пакета и метод синтаксического анализа выглядит следующим образом:

public Date parse(String source) throws ParseException 
{ 
    ParsePosition pos = new ParsePosition(0); 
    Date result = parse(source, pos); 
    if (pos.index == 0) 
     throw new ParseException("Unparseable date: \"" + source + "\"" , 
      pos.errorIndex); 
    return result; 
} 

То, что я уже пытался сделать, это установить bs.getFromDate к нулю, но тест всегда будет красным. Я использовал @Test(expected: ParseException.class) аннотацию в своем тесте, но я просто не могу сделать ее зеленой. Возможно, bs.getFromDate не является правильным значением, которое анализируется?

Есть ли у кого-нибудь другая идея, как сделать эту тестовую работу? Заранее спасибо!

+0

Вы бы ввели метод JUnit Test? Может быть, какой-то другой Expcetion происходит до него? – darijan

ответ

1

ИТАК самый простой способ заключается в следующем:

  • Перезвонить вам метод с аргументами, которые будут бросать ParseException
  • Если исключение не брошено к испытанию это означает, что он был пойман в методе

Глядя в код есть другой способ вы можете сделать:
Я вижу, вы установили начать диапазон дат на модели, если исключение имеет был пойман: model.setBeginDateRange (CalendarConstants.getMinDate());

Так что в вашем тесте вы можете проверить, если:
model.getBeginDateRange() равна CalendarConstants.getMinDate()
(Вы, возможно, потребуется, чтобы получить актуальную версию модели до этого проверки в зависимости от того, как ваш код работает)

Надеюсь, что это поможет.

+0

Другой способ - это единственный способ проверить этот метод. Спасибо! – user2440009

+0

Для чистого модульного теста вы не должны вызывать исключение в другом методе. Вы должны издеваться над ним. – JamesB

1

В аннотации JUnit @Test(expected) необходимо четко указать, какое исключение будет выбрано.

Если вы принимаете ParseException, но выдается NullPointerException, тест будет показан как сбой.

Попробуйте @Test(expected = Exception.class) и посмотрите, справляется ли это с ними все.

+0

Он принимает литерал класса, а не строку, поэтому используйте '@Test (expected = ParseException.class)' – Jorn

+0

Исправить; Я изменю его. – duffymo

1

Используйте mock framework (например, Mockito, EasyMock), чтобы высмеять вызов метода projectDateToCalendarDefaultMin и выбросить ParseException.

Ваше утверждение условия сообщения будет состоять в том, что для свойства beginDateRange модели установлено значение CalendarConstants.getMinDate().

0

Я думаю, что другое исключение бросается, и вы его не поймаете. А именно, когда вы вызываете этот метод:

projectDateToCalendarDefaultMin(final BigDecimal dateValue, final boolean useMinDate) throws ParseException { 

со значением null для dateValue вы получите NullPointerExcpetion, и именно поэтому ваш тест красный.

+0

Итак, что вы предлагаете установить в dateValue, чтобы получить ParseException? DateValue имеет тип «BigDecimal». – user2440009

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