Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mock new Date() in java using Mockito

I have a function that uses the current time to make some calculations. I'd like to mock it using mockito.

An example of the class I'd like to test:

public class ClassToTest {     public long getDoubleTime(){         return new Date().getTime()*2;     } } 

I'd like something like:

@Test public void testDoubleTime(){    mockDateSomeHow(Date.class).when(getTime()).return(30);    assertEquals(60,new ClassToTest().getDoubleTime()); } 

Is it possible to mock that? I wouldn't like to change the "tested" code in order to be tested.

like image 496
Jordi P.S. Avatar asked Aug 09 '12 16:08

Jordi P.S.


People also ask

How do you mock a timestamp in Java?

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf. setTimeZone(TimeZone. getTimeZone("PST")); Date NOW = sdf. parse("2019-02-11 00:00:00"); Timestamp time=new Timestamp(NOW.


1 Answers

The right thing to do is to restructure your code to make it more testable as shown below. Restructuring your code to remove the direct dependency on Date will allow you to inject different implementations for normal runtime and test runtime:

interface DateTime {     Date getDate(); }  class DateTimeImpl implements DateTime {     @Override     public Date getDate() {        return new Date();     } }  class MyClass {      private final DateTime dateTime;     // inject your Mock DateTime when testing other wise inject DateTimeImpl      public MyClass(final DateTime dateTime) {         this.dateTime = dateTime;     }      public long getDoubleTime(){         return dateTime.getDate().getTime()*2;     } }  public class MyClassTest {     private MyClass myClassTest;      @Before     public void setUp() {         final Date date = Mockito.mock(Date.class);         Mockito.when(date.getTime()).thenReturn(30L);          final DateTime dt = Mockito.mock(DateTime.class);         Mockito.when(dt.getDate()).thenReturn(date);          myClassTest = new MyClass(dt);     }      @Test     public void someTest() {         final long doubleTime = myClassTest.getDoubleTime();         assertEquals(60, doubleTime);     } } 
like image 103
munyengm Avatar answered Sep 21 '22 09:09

munyengm