我如何模拟java.time.LocalDate.now()

问题描述 投票:38回答:5

在我的测试案例中,我需要测试时间敏感的方法,在该方法中,我们使用的是Java 8类LocalDate,它是not Joda

进行测试时,我该如何更改时间

java java-8 java-time systemtime
5个回答
70
投票

在您的代码中,将LocalDate.now()替换为LocalDate.now(clock);

然后您可以通过LocalDate.now(clock);进行生产,并通过Clock.systemDefaultZone()进行测试。


这是一个示例:

首先,注入a fixed clock。如果您使用的是Spring Boot,请执行::>

Clock

第二,在您的代码中调用@Bean public Clock clock() { return Clock.systemDefaultZone(); }

LocalDate.now(clock)

现在,在您的单元测试课中:

@Component
public class SomeClass{

    @Autowired
    private Clock clock;

    public LocalDate someMethod(){
         return LocalDate.now(clock);
    }
}

}


4
投票

您可以重构代码以使其易于测试,例如,用自定义可模拟非静态类的某些方法的调用替换// Some fixed date to make your tests private final static LocalDate LOCAL_DATE = LocalDate.of(1989, 01, 13); // mock your tested class @InjectMocks private SomeClass someClass; //Mock your clock bean @Mock private Clock clock; //field that will contain the fixed clock private Clock fixedClock; @Before public void initMocks() { MockitoAnnotations.initMocks(this); //tell your tests to return the specified LOCAL_DATE when calling LocalDate.now(clock) fixedClock = Clock.fixed(LOCAL_DATE.atStartOfDay(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault()); doReturn(fixedClock.instant()).when(clock).instant(); doReturn(fixedClock.getZone()).when(clock).getZone(); } @Test public void testSomeMethod(){ // call the method to test LocalDate returnedLocalDate = someClass.someMethod(); //assert assertEquals(LOCAL_DATE, returnedLocalDate); 的所有调用。


1
投票

您可能还希望在生产中传递一个固定的时钟(该值在事务开始时是固定的,以避免在不同的实体和请求中使用不一致的“现在”。有关详细信息,请参见PowerMock's mockStatic


1
投票

如果需要模拟像now()这样的静态方法,我们可以使用this question之类的多种替代方法:


0
投票

使用Spring:

© www.soinside.com 2019 - 2024. All rights reserved.