I want to mock the default constructor of java.util.date
so it does not construct
a Date
object representing the time when it was created, but always the same Date
object (in my example below 31 Dec 2010). I tried doing this with JMockit
and JUnit
, but when executing my test below, the output is always Thu Jan 01 01:00:00 CET 1970
. So what is wrong with my mock of Date()
?
import java.util.Date;
import org.junit.*;
import mockit.*;
public class AppTest {
@Before
public void setUp() {
Mockit.setUpMocks(MockedDate.class);
}
@After
public void tearDown() {
Mockit.tearDownMocks();
}
@Test
public void testDate() {
Date today=new Date();
System.out.println(today.toString());
}
@MockClass(realClass=Date.class)
public static class MockedDate {
@Mock
public void $init() {
// Now should be always 31.12.2010!
new Date(110,11,31); //110 = 2010! 11 = December! This is sick!
}
}
}
al nik's answer was a good hint for me. It is better to mock the System
class instead of the Date
class to generate a fake time. My own solution in the end was simply to mock the System.currentTimeMillis()
method (this method is called by Date()
internally).
JMockit 1.5 and later
new MockUp<System>(){
@Mock
public long currentTimeMillis() {
// Now is always 11/11/2011
Date fake = new Date(111,10,11);
return fake.getTime();
}
};
JMockit 1.4 and earlier
@MockClass(realClass = System.class)
public static class MockedSystem {
@Mock
public long currentTimeMillis() {
// Now is always 11/11/2011
Date fake = new Date(111,10,11);
return fake.getTime();
}
}