如何伪造java.time.LocalDate返回的日期?

如何伪造java.time.LocalDate返回的日期?,java,Java,我需要能够在测试时伪造系统时间。我的源代码使用java.time.LocalDate。有没有办法让LocalDate.now()返回一个预设的日期?你能通过代码的构造函数/参数注入时间吗 否则,您可以将LocalDate.now()封装在一个静态类中,让您硬编码一个值以进行测试。我通常建议使用Mockito,但由于该方法是静态的,因此您无法真正模拟对象 为什么不让一些“DateProvider”类为你抓取日期呢 public class DateProvider{ public Local

我需要能够在测试时伪造系统时间。我的源代码使用java.time.LocalDate。有没有办法让
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()