2015-03-13 76 views
2

我需要在测试时能够伪造系统时间。我使用java.time.LocalDate的源代码。有没有办法让LocalDate.now()返回预设日期?如何伪造java.time.LocalDate返回的日期?

+2

为调用LocalDate.now创建一个包装方法,并让它在您处于测试用例时返回您的值。 – 2015-03-13 17:40:54

+1

接受时钟的LocalDate.now有一个重载。你可以使用它吗? – 2015-03-13 17:41:22

+0

你真的应该注入一个时钟,而不是试图伪造系统时间。 – 2015-03-13 18:58:51

回答

6

您有几个选项:

  1. LocalDate.now()调用换成类的非静态方法。然后,您可以嘲笑该方法以返回您的特定实例 - 如果您在代码中的许多位置直接调用LocalDate.now()方法,这看起来并不实际。

  2. 使用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); 
    } 
} 
+0

您可能需要将您的类放入准备好的列表中:'@PrepareForTest({MyFooService.class,LocalDate.class})' – 2018-01-23 16:57:58

1

你可以依赖通过代码的构造函数/参数注入时间?

否则,您可以将LocalDate.now()包装在静态类中,该静态类允许您对测试值进行硬编码。

1

我通常会建议使用Mockito,但由于该方法是静态的,因此您无法真正模拟该对象。

为什么不能有一些“DateProvider”级抢你

public class DateProvider{ 
    public LocalDate getNow(){ 
     return LocalDate.now(); 
    } 
} 

日期正是如此使用它:

new DateProvider().getNow(); 

这将使相当容易与任何LOCALDATE的返回值

测试
2

没有必要在这里面条代码:保持简单! 写一个便利方法并改变它的身体以满足您的需求。

public static LocalDate getCurrentTime() { 
    // You can comment right code to save it during debugging 
} 
0

我试图代码此页面上,但我发现我应该先得到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 

} 
0

的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(); 
    } 
}