在我的测试案例中,我需要测试时间敏感的方法,在该方法中,我们使用的是Java 8类LocalDate,它是not Joda。
进行测试时,我该如何更改时间
在您的代码中,将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); } }
}
您可以重构代码以使其易于测试,例如,用自定义可模拟非静态类的某些方法的调用替换// 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);
的所有调用。
您可能还希望在生产中传递一个固定的时钟(该值在事务开始时是固定的,以避免在不同的实体和请求中使用不一致的“现在”。有关详细信息,请参见PowerMock's mockStatic。
如果需要模拟像now()这样的静态方法,我们可以使用this question之类的多种替代方法:
使用Spring: