1
+ package com .learning .greetingservice ;
2
+
3
+ import org .junit .jupiter .api .Test ;
4
+ import org .springframework .boot .actuate .health .Health ;
5
+ import org .springframework .test .util .ReflectionTestUtils ;
6
+ import org .springframework .boot .actuate .health .Status ;
7
+
8
+ import java .util .function .BooleanSupplier ;
9
+
10
+ import static org .junit .jupiter .api .Assertions .*;
11
+
12
+ class MyCustomHealthCheckTest {
13
+
14
+ @ Test
15
+ void testHealthUp () {
16
+ MyCustomHealthCheck healthCheck = new MyCustomHealthCheck ();
17
+ // Simulate a healthy state
18
+ ReflectionTestUtils .setField (healthCheck , "isHealthy" , true );
19
+ Health health = healthCheck .health ();
20
+ assertEquals (Status .UP , health .getStatus ());
21
+ assertTrue (health .getDetails ().containsKey ("message" ));
22
+ assertEquals ("Service is running and scheduled checks are OK" , health .getDetails ().get ("message" ));
23
+ }
24
+
25
+ @ Test
26
+ void testHealthDown () {
27
+ MyCustomHealthCheck healthCheck = new MyCustomHealthCheck ();
28
+ // Simulate an unhealthy state
29
+ ReflectionTestUtils .setField (healthCheck , "isHealthy" , false );
30
+ Health health = healthCheck .health ();
31
+ assertEquals (Status .DOWN , health .getStatus ());
32
+ assertTrue (health .getDetails ().containsKey ("error" ));
33
+ assertEquals ("Scheduled health checks failed" , health .getDetails ().get ("error" ));
34
+ }
35
+
36
+ @ Test
37
+ void testUpdateHealthStatusSetsIsHealthy () throws Exception {
38
+ MyCustomHealthCheck healthCheck = new MyCustomHealthCheck ();
39
+
40
+ // Force performHealthCheck to return true (by time simulation - might be flaky)
41
+ long currentTimeForTrue = System .currentTimeMillis ();
42
+ while (currentTimeForTrue % 10000 >= 5000 ) {
43
+ Thread .sleep (10 ); // Wait until time is in the "true" range
44
+ currentTimeForTrue = System .currentTimeMillis ();
45
+ }
46
+ ReflectionTestUtils .invokeMethod (healthCheck , "performHealthCheck" );
47
+ healthCheck .updateHealthStatus ();
48
+ assertTrue ((Boolean ) ReflectionTestUtils .getField (healthCheck , "isHealthy" ), "Health should be true" );
49
+
50
+ // Force performHealthCheck to return false (by time simulation - might be flaky)
51
+ long currentTimeForFalse = System .currentTimeMillis ();
52
+ while (currentTimeForFalse % 10000 < 5000 ) {
53
+ Thread .sleep (10 ); // Wait until time is in the "false" range
54
+ currentTimeForFalse = System .currentTimeMillis ();
55
+ }
56
+ ReflectionTestUtils .invokeMethod (healthCheck , "performHealthCheck" );
57
+ healthCheck .updateHealthStatus ();
58
+ assertFalse ((Boolean ) ReflectionTestUtils .getField (healthCheck , "isHealthy" ), "Health should be false" );
59
+ }
60
+
61
+ // Note: Directly testing performHealthCheck (the private method) based on time is inherently
62
+ // difficult and can lead to flaky tests. The testUpdateHealthStatus attempts to indirectly
63
+ // verify its behavior. For more robust testing of performHealthCheck in isolation,
64
+ // you might consider refactoring the class to make the time dependency injectable
65
+ // or making the method protected for testing purposes.
66
+ }
0 commit comments