Skip to content

Commit 4f7f9cf

Browse files
committed
Use Mockito.mockStatic() for mocking DateAndTime.DefaultClock
WE2-841 Signed-off-by: Mart Somermaa <[email protected]>
1 parent 78c1ac5 commit 4f7f9cf

File tree

4 files changed

+31
-46
lines changed

4 files changed

+31
-46
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113
</execution>
114114
</executions>
115115
</plugin>
116-
<!-- Build Javacdoc JAR during packaging -->
116+
<!-- Build Javadoc JAR during packaging -->
117117
<plugin>
118118
<groupId>org.apache.maven.plugins</groupId>
119119
<artifactId>maven-javadoc-plugin</artifactId>
@@ -152,7 +152,7 @@
152152

153153
<!-- For publishing the library to GitHub Packages/GitLab Package Repository -->
154154
<distributionManagement>
155-
<!-- Github Packages does not currently support public access, so disabled until it does.
155+
<!-- GitHub Packages does not currently support public access, so disabled until it does.
156156
See https://github.community/t/download-from-github-package-registry-without-authentication/14407
157157
<repository>
158158
<id>github</id>

src/main/java/eu/webeid/security/util/DateAndTime.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ public static void requirePositiveDuration(Duration duration, String fieldName)
4545

4646
public static class DefaultClock implements Clock {
4747

48-
protected static Clock instance = new DefaultClock();
48+
// Allows mocking of time-dependent behavior with Mockito.mockStatic().
49+
private static final Clock instance = new DefaultClock();
4950

5051
public static Clock getInstance() {
5152
return instance;

src/test/java/eu/webeid/security/testutil/Dates.java

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,44 +23,19 @@
2323
package eu.webeid.security.testutil;
2424

2525
import com.fasterxml.jackson.databind.util.StdDateFormat;
26-
import io.jsonwebtoken.Clock;
27-
import eu.webeid.security.util.DateAndTime;
2826

29-
import java.lang.reflect.Field;
30-
import java.lang.reflect.Modifier;
3127
import java.text.ParseException;
3228
import java.util.Date;
3329

3430
public final class Dates {
3531
private static final StdDateFormat STD_DATE_FORMAT = new StdDateFormat();
3632

37-
public static Date create(String iso8601Date) throws ParseException {
38-
return STD_DATE_FORMAT.parse(iso8601Date);
39-
}
40-
41-
public static void setMockedCertificateValidatorDate(Date mockedDate) throws NoSuchFieldException, IllegalAccessException {
42-
setClockField(DateAndTime.DefaultClock.class, mockedDate);
43-
}
44-
45-
public static void resetMockedCertificateValidatorDate() throws NoSuchFieldException, IllegalAccessException {
46-
setClockField(DateAndTime.DefaultClock.class, new Date());
47-
}
48-
49-
private static void setClockField(Class<? extends Clock> cls, Date date) throws NoSuchFieldException, IllegalAccessException {
50-
final Field clockField = cls.getDeclaredField("instance");
51-
setFinalStaticField(clockField, (Clock) () -> date);
52-
}
53-
54-
private static void setFinalStaticField(Field field, Object newValue) throws NoSuchFieldException, IllegalAccessException {
55-
field.setAccessible(true);
56-
57-
/* https://stackoverflow.com/questions/56039341/get-declared-fields-of-java-lang-reflect-fields-in-jdk12
58-
final Field modifiersField = Field.class.getDeclaredField("modifiers");
59-
modifiersField.setAccessible(true);
60-
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
61-
*/
62-
63-
field.set(null, newValue);
33+
public static Date create(String iso8601Date) {
34+
try {
35+
return STD_DATE_FORMAT.parse(iso8601Date);
36+
} catch (ParseException e) {
37+
throw new RuntimeException(e);
38+
}
6439
}
6540

6641
}

src/test/java/eu/webeid/security/validator/AuthTokenCertificateTest.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,32 @@
2424

2525
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
2626
import eu.webeid.security.authtoken.WebEidAuthToken;
27-
import eu.webeid.security.exceptions.*;
27+
import eu.webeid.security.exceptions.AuthTokenException;
28+
import eu.webeid.security.exceptions.AuthTokenParseException;
29+
import eu.webeid.security.exceptions.CertificateDecodingException;
30+
import eu.webeid.security.exceptions.CertificateExpiredException;
31+
import eu.webeid.security.exceptions.CertificateNotTrustedException;
32+
import eu.webeid.security.exceptions.CertificateNotYetValidException;
33+
import eu.webeid.security.exceptions.UserCertificateDisallowedPolicyException;
34+
import eu.webeid.security.exceptions.UserCertificateMissingPurposeException;
35+
import eu.webeid.security.exceptions.UserCertificateRevokedException;
36+
import eu.webeid.security.exceptions.UserCertificateWrongPurposeException;
2837
import eu.webeid.security.testutil.AbstractTestWithValidator;
2938
import eu.webeid.security.testutil.AuthTokenValidators;
3039
import eu.webeid.security.testutil.Dates;
40+
import eu.webeid.security.util.DateAndTime;
41+
import io.jsonwebtoken.Clock;
3142
import org.junit.jupiter.api.AfterEach;
3243
import org.junit.jupiter.api.BeforeEach;
3344
import org.junit.jupiter.api.Disabled;
3445
import org.junit.jupiter.api.Test;
46+
import org.mockito.MockedStatic;
3547

3648
import java.security.cert.CertificateException;
37-
import java.text.ParseException;
49+
import java.util.Date;
3850

3951
import static org.assertj.core.api.Assertions.assertThatThrownBy;
52+
import static org.mockito.Mockito.mockStatic;
4053

4154
class AuthTokenCertificateTest extends AbstractTestWithValidator {
4255

@@ -56,21 +69,20 @@ class AuthTokenCertificateTest extends AbstractTestWithValidator {
5669
private static final String EXPIRED_ECDSA_CERT = "MIIF0TCCA7mgAwIBAgIQMBVFXroEt3hZ8FHcKKE65TANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEXMBUGA1UEYQwOTlRSRUUtMTA3NDcwMTMxFzAVBgNVBAMMDkVTVEVJRC1TSyAyMDE1MB4XDTE3MTAyNTA4NTcwMFoXDTIxMDIxMDIxNTk1OVowgYsxCzAJBgNVBAYTAkVFMQ8wDQYDVQQKDAZFU1RFSUQxFzAVBgNVBAsMDmF1dGhlbnRpY2F0aW9uMR4wHAYDVQQDDBVUT09NLE1BUlQsMzc2MDIwNDAzMzQxDTALBgNVBAQMBFRPT00xDTALBgNVBCoMBE1BUlQxFDASBgNVBAUTCzM3NjAyMDQwMzM0MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAExS1YQQBDLVvOi0a2GA5Y34AXODpx0AL8eKDOB7BjwBc/FAyVExhfb6O+lT5Tnaec3GnT4JNRyeV8d82L8cyOgFn4PWc+5cjFdmcZjJbtCvgyBOQQ831tteIDL2XSrvZEo4ICBDCCAgAwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCA4gwUwYDVR0gBEwwSjA+BgkrBgEEAc4fAQEwMTAvBggrBgEFBQcCARYjaHR0cHM6Ly93d3cuc2suZWUvcmVwb3NpdG9vcml1bS9DUFMwCAYGBACPegECMB8GA1UdEQQYMBaBFG1hcnQudG9vbS4zQGVlc3RpLmVlMB0GA1UdDgQWBBSzneoLqtqbvHvJ19cjhp2XR5ovQTAgBgNVHSUBAf8EFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHwYDVR0jBBgwFoAUs6uIvJnVYqSFKgjNtB1yO4NyR1EwYQYIKwYBBQUHAQMEVTBTMFEGBgQAjkYBBTBHMEUWP2h0dHBzOi8vc2suZWUvZW4vcmVwb3NpdG9yeS9jb25kaXRpb25zLWZvci11c2Utb2YtY2VydGlmaWNhdGVzLxMCRU4wagYIKwYBBQUHAQEEXjBcMCcGCCsGAQUFBzABhhtodHRwOi8vYWlhLnNrLmVlL2VzdGVpZDIwMTUwMQYIKwYBBQUHMAKGJWh0dHA6Ly9jLnNrLmVlL0VTVEVJRC1TS18yMDE1LmRlci5jcnQwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL3d3dy5zay5lZS9jcmxzL2VzdGVpZC9lc3RlaWQyMDE1LmNybDANBgkqhkiG9w0BAQsFAAOCAgEAOXTvktUXqPgaK/uxzgH0xSEYClBAWIQaNgpqY5lwsQtgQnpfKlsADqMZxCp7UuuMvQmpDbBxv1kIr0oG1uUXrUtPw81XOH1ClwPPXWpg9VRTAetNbHTBbHDyzuXQMNeDmrntChs+BteletejGD+aYG39HGMlrMbGQZOgvQrpYHMDek0ckCPEsZRXqUP0g7Ie7uBQhz5At7l4EDAeOW8xGoI6t+Ke4GedccXKef60w2ZIIDzvOFHPTc6POCsIlFtF/nCKwVi7GoQKjbUbM5OdBLZ0jyLq2LvzZuT86Jo8wObziuSzApGlBexHAqLrR83q+/Xl61yPnFf3w2kAfS9kBjeunzTH7Jm3pNT3Zq9JRLvEDqtpOPqr4zm9nG6OSghFU6tySkpQ5HiakGpMcnt5o5KuXhQ+Dg317tdXPyQkSiuJ9NfEBW0ijrwO12SVRzYo/jRl4ZQUkAEEUSMEsC6gTsZypPdIsLDVoQWTytHDU89s1xJDn4HulPl12dFnrhlLeX4RxOjDxppZxdjBU0FoJoDB0qwEAN2TMAPJWh+Pp9mFuS/u0dht9sKvAkpx+o0Z7v7QMz03XlzCHOLTIK+f81Rjokl8f+wiog5Ojj0wZkDe6DuQC9L5uDey3PJHv3naVovhs7jrEJu+yrsLue/OHhAgWRh2S75/wlVPHPEE44k=";
5770
private static final String REVOKED_CERT = "MIIERDCCA6agAwIBAgIQSs8/WoDixVxbKRhNnF/GEzAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTE4MDYxOTE0NTA1M1oXDTIwMDEwMjIxNTk1OVowfzELMAkGA1UEBhMCRUUxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEQMA4GA1UEBAwHSsOVRU9SRzEWMBQGA1UEKgwNSkFBSy1LUklTVEpBTjEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR/jopNG3KL0ZQUvO4OGSvcaqUtFDm3azOtsM2VRp666r0d36Zh0Zx/xej8f+SzEfWvvDT1HQLo3USiSbYn1FyNHTNxifV+Zvf6StXJAkdu24d1UvKbf+LylglO/yS7o4ijggIEMIICADAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIDiDBHBgNVHSAEQDA+MDIGCysGAQQBg5F/AQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAIBgYEAI96AQIwHwYDVR0RBBgwFoEUMzgwMDEwODU3MThAZWVzdGkuZWUwHQYDVR0OBBYEFEQA6/1GXJtp+6czUzorhEJ7B95pMGEGCCsGAQUFBwEDBFUwUzBRBgYEAI5GAQUwRzBFFj9odHRwczovL3NrLmVlL2VuL3JlcG9zaXRvcnkvY29uZGl0aW9ucy1mb3ItdXNlLW9mLWNlcnRpZmljYXRlcy8TAkVOMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezB/BggrBgEFBQcBAQRzMHEwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MEEGCCsGAQUFBzAChjVodHRwczovL3NrLmVlL3VwbG9hZC9maWxlcy9URVNUX29mX0VTVEVJRDIwMTguZGVyLmNydDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vYy5zay5lZS90ZXN0X2VzdGVpZDIwMTguY3JsMAoGCCqGSM49BAMEA4GLADCBhwJBcmcfLC+HcSJ6BuRrDGL+K+7BAW8BfAiiWWAuBV4ebLkbbAWmkc9dSKgr4BEGEt90xDTQ85yW4SjGulFXu9C3yQsCQgETaXTs3Hp6vDAcQYL8Bx4BO3DwJbDuD4BUJyT0+9HQiFCQmTQ4xrNjeaeOwRWyMOM9z5ORMeJCiQUyil1x4YPIbg==";
5871

72+
private MockedStatic<DateAndTime.DefaultClock> mockedClock;
73+
5974
@Override
6075
@BeforeEach
6176
protected void setup() {
6277
super.setup();
78+
mockedClock = mockStatic(DateAndTime.DefaultClock.class);
6379
// Ensure that the certificates do not expire.
6480
mockDate("2021-08-01");
6581
}
6682

6783
@AfterEach
6884
public void tearDown() {
69-
try {
70-
Dates.resetMockedCertificateValidatorDate();
71-
} catch (NoSuchFieldException | IllegalAccessException e) {
72-
throw new RuntimeException(e);
73-
}
85+
mockedClock.close();
7486
}
7587

7688
@Test
@@ -275,11 +287,8 @@ void whenCertificateCaIsNotPartOfTrustChain_thenValidationFails() throws Excepti
275287
}
276288

277289
private void mockDate(String date) {
278-
try {
279-
Dates.setMockedCertificateValidatorDate(Dates.create(date));
280-
} catch (ParseException | NoSuchFieldException | IllegalAccessException e) {
281-
throw new RuntimeException(e);
282-
}
290+
final Date theDate = Dates.create(date);
291+
mockedClock.when(DateAndTime.DefaultClock::getInstance).thenReturn((Clock) () -> theDate);
283292
}
284293

285294
}

0 commit comments

Comments
 (0)