如何伪造java.time.LocalDate返回的日期?
我需要能够在测试时伪造系统时间。我的源代码使用java.time.LocalDate。有没有办法让如何伪造java.time.LocalDate返回的日期?,java,Java,我需要能够在测试时伪造系统时间。我的源代码使用java.time.LocalDate。有没有办法让LocalDate.now()返回一个预设的日期?你能通过代码的构造函数/参数注入时间吗 否则,您可以将LocalDate.now()封装在一个静态类中,让您硬编码一个值以进行测试。我通常建议使用Mockito,但由于该方法是静态的,因此您无法真正模拟对象 为什么不让一些“DateProvider”类为你抓取日期呢 public class DateProvider{ public Local
LocalDate.now()返回一个预设的日期?你能通过代码的构造函数/参数注入时间吗
否则,您可以将LocalDate.now()封装在一个静态类中,让您硬编码一个值以进行测试。我通常建议使用Mockito,但由于该方法是静态的,因此您无法真正模拟对象
为什么不让一些“DateProvider”类为你抓取日期呢
public class DateProvider{
public LocalDate getNow(){
return LocalDate.now();
}
}
并因此而使用它:
new DateProvider().getNow();
这将使使用任何LocalDate返回值进行测试变得相当容易。您有几个选项:
将LocalDate.now()调用包装到类的非静态方法中。然后,您可以模拟该方法来返回您的特定实例—如果您在代码中的许多地方直接调用LocalDate.now()
方法,这似乎不太实际
使用LocalDate.now(Clock)
方法,这是一种非常友好的测试方法,正如注释中所建议的那样——同样,您必须修改您的应用程序代码
如果可以,请使用。在这种情况下,通过使用方法模拟静态方法,您就有了一个非常简单的方法
第三种方法可以实现为:
@PrepareForTest({ LocalDate.class })
@RunWith(PowerMockRunner.class)
public class DateTest {
@Test
public void yourTest() {
PowerMockito.mockStatic(LocalDate.class);
when(LocalDate.now()).thenReturn(yourLocalDateObj);
}
}
这里不需要意大利面代码:保持简单!
编写一个方便的方法并更改其主体以满足您的需要
public static LocalDate getCurrentTime() {
// You can comment right code to save it during debugging
}
我尝试了这个页面上的代码,但我注意到我应该先获得LocalDate实例,然后再使用PowerMockito作为下一个代码的前两行
@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
}
@测试
public void testYearOptions()引发异常{
LocalDate日期=LocalDate.of(2015,11,12);
mockStatic(LocalDate.class);
Mockito.when(LocalDate.now()).thenReturn(date);
Map-semesterMap=Utilities.getYears();//使用LocalDate所在的函数
assertNotNull(yearsMap.get(“2015”);//您的断言
}
用于测试:
@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();
}
}
为调用LocalDate.now
创建一个包装器方法,如果您在测试用例中,则让它返回您的值。LocalDate.now有一个重载,它接受一个时钟。你能用它吗?你真的应该注入一个时钟,而不是试图伪造系统时间。你可以参考下面的链接。您可能需要将您的类放入准备好的类列表中:@PrepareForTest({MyFooService.class,LocalDate.class})
如何模拟这行代码以返回2020-02-27 LocalDate.now().plusDays(Long.parseLong(“0”).toString()但是当它到达那一行时,它会返回todays date()我如何模拟这一行代码来返回2020-02-27 LocalDate.now().plusDays(Long.parseLong(“0”)).toString()但是当它到达那一行时,它会返回todays date()