gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:00:01 31 4
gpt4 key购买 nike

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

当我运行测试时,我可以做些什么来改变时间

最佳答案

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

然后您可以将 Clock.systemDefaultZone() 用于生产和 a fixed clock用于测试。


这是一个例子:

首先,注入(inject) Clock。如果您使用的是 Spring Boot ,只需执行以下操作:

@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);
}

关于java - 我如何模拟 java.time.LocalDate.now(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792000/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com