2015-03-13 3 views
2

Мне нужно иметь возможность подделать системное время при тестировании. У источника, который у меня есть, используется java.time.LocalDate. Есть ли способ сделать LocalDate.now() возврат заранее установленной даты?Как мне подделать дату, возвращенную java.time.LocalDate?

+2

Создайте метод обёртки для вызовов в «LocalDate.now» и пусть он вернет ваши значения, если вы в тестовом примере. –

+1

Существует перегрузка LocalDate.now, которая принимает часы. Можете ли вы использовать это? –

+0

Вам действительно нужно вводить часы, а не пытаться подделать системное время. –

ответ

6

Имеется несколько вариантов:

  1. Оберните вызов LocalDate.now() в нестационарный метод класса. Затем вы можете издеваться над этим методом, чтобы вернуть свой конкретный экземпляр. Это не выглядит практичным, если вы вызываете метод LocalDate.now() во многих местах вашего кода.

  2. Используйте метод LocalDate.now(Clock), это довольно удобно для тестирования, как уже было предложено в комментариях - вам снова нужно изменить код приложения.

  3. Используйте Powermockito, если можно. В этом случае вы довольно легко подходите, издеваясь над статическими методами, используя метод mockStatic(Class<?>).

3-й подход может быть реализован как:

@PrepareForTest({ LocalDate.class }) 
@RunWith(PowerMockRunner.class) 
public class DateTest { 
    @Test 
    public void yourTest() { 
     PowerMockito.mockStatic(LocalDate.class); 
     when(LocalDate.now()).thenReturn(yourLocalDateObj); 
    } 
} 
+0

Возможно, вам нужно включить класс в список подготовленных: '@PrepareForTest ({MyFooService.class, LocalDate.class})' –

1

Можете ли вы зависеть от времени вводить время через конструктор/параметр кода?

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

1

Обычно я предлагаю использовать Mockito, но поскольку метод статичен, вы не можете действительно издеваться над объектом.

Почему бы не некоторые «DateProvider» Класс захватить дату вас

public class DateProvider{ 
    public LocalDate getNow(){ 
     return LocalDate.now(); 
    } 
} 

и использовать его таким образом:

new DateProvider().getNow(); 

Что бы сделать это довольно легко проверить с любым возвращаемым значением LocalDate

2

Нет необходимости спагетти кода здесь: держать его просто! Напишите удобный способ и смените его тело в соответствии с вашими потребностями.

public static LocalDate getCurrentTime() { 
    // You can comment right code to save it during debugging 
} 
0

Я пытался код на этой странице, но я заметил, что я должен получить LocalDate экземпляр первого, прежде чем использовать PowerMockito как 2 firstLines следующего кода

@Test 
public void testYearOptions() throws Exception{ 

    LocalDate date = LocalDate.of(2015,11,12); 
    PowerMockito.mockStatic(LocalDate.class); 

    Mockito.when(LocalDate.now()).thenReturn(date); 
    Map<String, String> semesterMap = Utilities.getYears(); //Your function where LocalDate is Uses 

    assertNotNull(yearsMap.get("2015"));//your assertion 

} 
0

Для тестирования:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class DateTimeFactoryTest { 
    private static final Logger log = LoggerFactory.getLogger(DateTimeFactoryTest.class); 

    @MockBean 
    DateTimeFactory dateTimeFactory; 

    @Test 
    public void test001() throws MissingMethodInvocationException { 
    given(dateTimeFactory.getLocalDate()).willReturn(LocalDate.of(2017,4, 4)); 
    LocalDate ld = dateTimeFactory.getLocalDate(); 
    } 
} 
Смежные вопросы