Override Java System.currentTimeMillis for testing time sensitive code
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.
Introduction
In Java, testing time-sensitive code can be challenging. The System.currentTimeMillis() method returns the current time in milliseconds, making it difficult to create predictable and repeatable tests. This article explores approaches to override or simulate System.currentTimeMillis() for testing purposes.
Understanding System.currentTimeMillis()
System.currentTimeMillis() is a static method in Java's System class that returns the current time in milliseconds since the Unix epoch (January 1, 1970, 00:00:00 GMT). The method is widely used for time-related operations, including logging, profiling, and timeout management.
Why Override System.currentTimeMillis()?
- Predictability: Tests become unpredictable when they depend on the current system time, leading to failure due to environmental differences.
- Isolation: Tests should ideally be isolated from external dependencies, including the system clock.
- Repeatability: Tests that rely on
System.currentTimeMillis()can yield different outcomes upon repeated execution due to varying time values.
Strategies to Override System.currentTimeMillis()
1. Utilize Dependency Injection
One approach is to refactor code to use dependency injection. By replacing direct calls to System.currentTimeMillis() with a time-providing interface, such as Clock, you can easily replace the implementation in test scenarios.
In tests, you can provide a mock or fake Clock implementation that returns a predetermined time.
2. Use a Static Wrapper Method
Instead of directly calling System.currentTimeMillis(), create a wrapper method in a utility class. This allows for overriding the behavior during tests.
In testing environments, mock the TimeProvider class to supply desired time values.
3. Leverage Libraries for Time Management
Libraries such as Joda-Time and Java 8's java.time package offer advanced time manipulation capabilities. Java 8's Clock class can also be leveraged for overriding time behavior.
This allows tests to operate under a fixed time as required.
4. Aspect-Oriented Programming (AOP)
Advanced users might prefer using AOP to intercept calls to time methods and replace them with desired behavior. AOP frameworks like AspectJ can be configured to modify System.currentTimeMillis() during tests.
Considerations
- Performance: Introducing interfaces or AOP may slightly affect the performance, but the impact is typically minimal.
- Complexity: Refactoring large codebases for dependency injection might be complex but pays off in testability.
- Maintainability: Ensure mock time implementations are easily maintainable and reflect any operational changes in the time-related logic.
Table of Key Points
| Method | Description | Pros | Cons |
| Dependency Injection | Provide time using an abstract interface. | Flexible, test-friendly | Requires code refactoring |
| Static Wrapper Method | Use a static method to wrap time calls. | Simple, centralized control | Static method mocking can be cumbersome |
| Time Libraries | Use time libraries for advanced manipulation. | Feature-rich, accurate | Dependency on additional libraries |
| AOP | Intercept time calls using AspectJ. | Transparent, less intrusive | Complex setup, potential performance impact |
Conclusion
Overriding System.currentTimeMillis() is essential for predictable, isolated, and repeatable tests in time-sensitive code. Whether you choose dependency injection, static wrappers, external libraries, or AOP, each method offers a distinct approach with its pros and cons. Selecting the most suitable method depends on your project's requirements, complexity, and test strategy.
Related reading
- Overriding an Autowired Bean in Unit Tests
- Overriding beans in Integration tests
- package org.springframework.boot does not exist
- Pagination with DynamoDBMapper Java AWS SDK
- Pass deep link into iOS Simulator?
- Passing Moq mock-objects to constructor
- Pagination with DynamoDBMapper Java AWS SDK
- Parameter 0 of constructor in ..... Spring Boot

OOD Fundamentals
Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.