2016-05-24 5 views
0

Я пишу тестовый пример с использованием JUnit API для метода. Я рассмотрел все сценарии, но тот, который мне тяжело, находится в блоке if. Когда я нависаю над этой строкой, Cobertura заявляет 50% 50% для каждого условия, но я не совсем уверен, как это покрыть.Распределение филиалов с JUnit и Mockito

Метод тестируемой:

protected boolean isDateWithinTimelineRange(Calendar date, ServiceContext ctx) { 
    Calendar end = (Calendar)ctx.getParameter(ServiceConstants.TIMELINE_END); 
    Calendar start = (Calendar)ctx.getParameter(ServiceConstants.TIMELINE_BEGIN); 

    if(end != null && start != null) { 
     if(date.getTimeInMillis() >= start.getTimeInMillis() && date.getTimeInMillis() <= end.getTimeInMillis()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    return true; 
} 

JUnit тест:

@Test 
public void testIsDateWithinTimelineRange() throws Exception { 
    ServiceContext context = Mockito.mock(ServiceContext.class); 
    Calendar calender = Mockito.mock(Calendar.class); 

    Mockito.when(context.getParameter(Mockito.anyString())).thenReturn(calender); 

    TestBaseTimelineProvider provider = new TestBaseTimelineProvider(); 
    boolean answer = provider.isDateWithinTimelineRange(calender, context); 

    assertNotNull(answer); 
    assertTrue(provider.isDateWithinTimelineRange(calender, context)); 

    // Testing for NULL condition 
    context = Mockito.mock(ServiceContext.class); 
    calender = Mockito.mock(Calendar.class); 
    Mockito.when(context.getParameter(Mockito.anyString())).thenReturn(null); 

    provider = new TestBaseTimelineProvider(); 
    answer = provider.isDateWithinTimelineRange(calender, context); 

    assertNotNull(answer); 
    assertTrue(provider.isDateWithinTimelineRange(calender, context)); 

    // Start date set to null 
    context = Mockito.mock(ServiceContext.class); 
    calender = Mockito.mock(Calendar.class); 
    ServiceConstants constants = new ServiceConstants(); 

    Mockito.when(context.getParameter(ServiceConstants.TIMELINE_END)).thenReturn(calender); 

    provider = new TestBaseTimelineProvider(); 
    answer = provider.isDateWithinTimelineRange(calender, context); 

    assertNotNull(constants); 

    // End date set to null 
    context = Mockito.mock(ServiceContext.class); 
    calender = Mockito.mock(Calendar.class); 
    constants = new ServiceConstants(); 

    Mockito.when(context.getParameter(ServiceConstants.TIMELINE_BEGIN)).thenReturn(calender); 

    provider = new TestBaseTimelineProvider(); 
    answer = provider.isDateWithinTimelineRange(calender, context); 

    assertNotNull(constants); 
} 

Что меня смущает это параметр date, что я насмешливый и которая определяет значения для end и start переменных.

if(date.getTimeInMillis() >= start.getTimeInMillis() && date.getTimeInMillis() <= end.getTimeInMillis()) {} - это линия, которую я хочу покрыть.

Благодаря

+1

Вам не нужно указывать, что нужно возвращать в методе 'getTimeInMillis()', например: 'Mockito.when (calender.getTimeInMillis()). ThenReturn (1L);' и отработать это ? В настоящее время вызов 'date.getTimeInMillis()' ничего не возвращает, поскольку объект 'date' был посмеялся, но ничего не было задано для вашего метода getTimeInMillis()' – Draken

+0

. Вы рассмотрели два случая, когда это возвращает true, но никогда не охватывал (два) случая, когда возвращается false (первый элемент не является истинным, или первый элемент true, а второй элемент не является истинным). У вас должен быть хотя бы один и, возможно, два случая, когда вы утверждаетеFalse (provider.isDateWithinTimelineRange) с действительными тестами для этого условия. – user1676075

+0

Да, на самом деле я отлаживал его, поэтому получили те два похожих теста. Я работаю над getTimeMillis(). –

ответ

1

Во-первых, вы никогда не говорил ваш издевались календарь объектов, что делать, когда getTimeInMillis() называется. Вам нужно добавить следующую информацию для каждой записи календаря:

// Assume `long desiredlong` defined; 
Mockito.when(calendar.getTimeInMillis()).thenReturn(desiredlong); 

Вам нужно будет сделать это для множества календарных объектов, где date.getTimeInMillis() находится в требуемом диапазоне, а другой набор, где date.getTimeInMillis() находится за пределами желаемого диапазона.

В конечном счете, случай, который охватывает истинную сторону этого теста будет иметь вид:

@Test 
public void validDatesInRange() { 
    ServiceContext context = Mockito.mock(ServiceContext.class); 
    Calendar calenderstart = Mockito.mock(Calendar.class); 
    Mockito.when(calendarstart.getTimeInMillis()).thenReturn(1L); 

    Calendar calendertarget = Mockito.mock(Calendar.class); 
    Mockito.when(calendartarget.getTimeInMillis()).thenReturn(2L); 

    Calendar calenderend = Mockito.mock(Calendar.class); 
    Mockito.when(calendarend.getTimeInMillis()).thenReturn(3L); 

    Mockito.when(context.getParameter(ServiceConstants.TIMELINE_END)).thenReturn(calenderend); 
    Mockito.when(context.getParameter(ServiceConstants.TIMELINE_BEGIN)).thenReturn(calenderstart); 

    TestBaseTimelineProvider provider = new TestBaseTimelineProvider(); 
    boolean answer = provider.isDateWithinTimelineRange(calendertarget, context); 

    assertNotNull(answer); 
    assertTrue(provider.isDateWithinTimelineRange(calendartarget, context)); 
} 

Во-вторых, вы никогда не писал ничего, что тестирует на ложный ответ. Чтобы покрыть другую сторону, скопируйте приведенное выше, но установите calendartarget.getTimeInMillis(), чтобы вернуть что-то смешное, например 1000L, и измените свои утверждения, чтобы они отражали false.

Вы также можете разбить ваши тестовые случаи в несколько методов, чьи имена отражают то, что каждый отдельный метод проверяет тест на, как validDatesInRange(), validDatesNotInRange(), startDateIsNull(), endDateIsNull(), contextIsNull(). Поступая таким образом, ваши тесты становятся все меньше и понятнее и отлаживаются, ваши тестовые прогоны создают более чистые и более информативные отчеты об испытаниях, а сбой в одном тесте не будет маскировать неудачи в других.

+0

Спасибо, Брэндон за подробный пост. Я обязательно буду следовать тому, что вы рекомендовали. –

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