Search code examples
javadefault-constructorjmockit

How to mock the default constructor of the Date class with JMockit?


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!
        }
    }
}

Solution

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