我需要在测试时能够伪造系统时间。我使用java.time.LocalDate的源代码。有没有办法让LocalDate.now()
返回预设日期?如何伪造java.time.LocalDate返回的日期?
回答
您有几个选项:
将
LocalDate.now()
调用换成类的非静态方法。然后,您可以嘲笑该方法以返回您的特定实例 - 如果您在代码中的许多位置直接调用LocalDate.now()
方法,这看起来并不实际。使用
LocalDate.now(Clock)
方法,这是非常友好的测试,如已在评论中所建议的 - 再次,您必须修改您的应用程序代码。如果可以的话,请使用Powermockito
。在这种情况下,通过使用mockStatic(Class<?>)
方法模拟静态方法,您可以非常轻松地进行操作。
第三方法可以实现:
@PrepareForTest({ LocalDate.class })
@RunWith(PowerMockRunner.class)
public class DateTest {
@Test
public void yourTest() {
PowerMockito.mockStatic(LocalDate.class);
when(LocalDate.now()).thenReturn(yourLocalDateObj);
}
}
您可能需要将您的类放入准备好的列表中:'@PrepareForTest({MyFooService.class,LocalDate.class})' – 2018-01-23 16:57:58
你可以依赖通过代码的构造函数/参数注入时间?
否则,您可以将LocalDate.now()包装在静态类中,该静态类允许您对测试值进行硬编码。
我通常会建议使用Mockito,但由于该方法是静态的,因此您无法真正模拟该对象。
为什么不能有一些“DateProvider”级抢你
public class DateProvider{
public LocalDate getNow(){
return LocalDate.now();
}
}
日期正是如此使用它:
new DateProvider().getNow();
这将使相当容易与任何LOCALDATE的返回值
测试没有必要在这里面条代码:保持简单! 写一个便利方法并改变它的身体以满足您的需求。
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
}
的2个firstLines来进行测试:
@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();
}
}
- 1. NSSearchPathDirectory.DocumentDirectory返回伪造路径
- 2. 如何返回日期值
- 3. 返回日期,如果日期范围
- 4. 如何返回日期小于特定日期的数组中的日期
- 5. SQL返回日期
- 6. 如何根据日期返回新ID?
- 7. 如何返回文件创建日期?
- 8. sql access如何在日期间返回
- 9. 从c#返回日期时间仅返回日期
- 10. 的日期SQL返回null
- 11. 返回不同的日期
- 12. 日期strptime返回无效日期
- 13. Javascript新日期()返回错误日期
- 14. 如何回到cygwin的日期,返回日期与静态第二值
- 15. $ _SERVER ['SERVER_NAME']是伪造/伪造的吗?
- 16. 如何为UTest伪造HttpContext.Current?
- 17. 如何伪造Http post?
- 18. 我该如何伪造ObjectContext?
- 19. 如何伪造在ActionScript 3
- 20. 如果特定日期的日期没有值,则返回0
- 21. CORS - 伪造邮差的CORS预检无法返回头文件
- 22. 减去日期返回负
- 23. DateTime.ParseExact返回当前日期
- 24. 重叠日期返回行
- 25. django.utils.timezone返回天真日期?
- 26. Datepicker仅返回日期
- 27. SimpleDateFormat.parse返回无效日期
- 28. 返回日期类型
- 29. SQL - 返回日期给出日期或日期加上动态日期的行
- 30. 如何返回给定日期的一周正确的日期 - 年月和
为调用LocalDate.now创建一个包装方法,并让它在您处于测试用例时返回您的值。 – 2015-03-13 17:40:54
接受时钟的LocalDate.now有一个重载。你可以使用它吗? – 2015-03-13 17:41:22
你真的应该注入一个时钟,而不是试图伪造系统时间。 – 2015-03-13 18:58:51