An Interest In:
Web News this Week
- April 19, 2024
- April 18, 2024
- April 17, 2024
- April 16, 2024
- April 15, 2024
- April 14, 2024
- April 13, 2024
How to get mockable current time in java enterprise
With Java version 8 it's very easy to get the current timestamp with LocalDateTime.now()
. One problem that might arise is it's not easily testable/mockable. Imagine some testing data and conditions depend on the date you set through this call, or you want to do "time travel". The solution is quite simple - define a service class that produces the current timestamp, which you can then easily mock, in this case we'll name it ProductionCalendar
:
@ApplicationScopedpublic class ProductionCalendar { public LocalDateTime currentTimestamp() { return LocalDateTime.now(); } public LocalDate currentDate() { return LocalDate.now(); } public String currentTimestamp(Partner partner) { return DateTimeFormatter.ofPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS") .format(LocalDateTime.now()); }}
Then when were you need to call LocalDateTime.now()
inject this service and use its methods instead:
@Statelesspublic class PartnerRepository { @Inject ProductionCalendar productionCalendar; @Inject EntityManager entityManager; public void savePartner(String partnerNumber) { Partner partner = new Partner(); partner.setPartnerNumber(partnerNumber); partner.setCreatedAt(productionCalendar.currentTimestamp()); entityManager.persist(partner); } public List<Partner> getPartnerCreatedAfterDate(LocalDateTime timestamp) { String queryJpql = "select p from P p where createdAt > :timestamp order by createdAt desc"; TypedQuery<Partner> query = entityManager.createQuery(queryJpql, Partner.class); query.setParameter("timestamp", timestamp); return query.getResultList(); }}
Then, in the test class you can easily mock ProductionCalendar
and calls to its methods and set timestamps as we need them:
@ExtendWith(MockitoExtension.class)@RunWith(JUnitPlatform.class)public class UserServiceUnitTest { @Inject PartnerRepository partnerRepository; @Mock ProductionCalendar productionCalendar; @Test void testGetLatestPartners() { when(productionCalendar.currentTimestamp()).thenReturn(LocalDatetime.now().minusDays(1)); partnerRepository.save("12345"); var recentPartners = partnerRepository.getPartnerCreatedAfterDate(LocalDatetime.now().minusDays(2)); assertThat(recentPartners, hasSize(1)); }}
Shared with from Codever. Use copy to mine functionality to add it to your personal snippets collection.
Original Link: https://dev.to/codever/how-to-get-mockable-current-time-in-java-enterprise-48n6
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To