1414import static org .mockito .Mockito .mock ;
1515import static org .mockito .Mockito .when ;
1616
17+ import java .util .logging .Level ;
18+ import java .util .logging .LogRecord ;
19+
1720import org .junit .jupiter .api .Test ;
18- import org .junit .jupiter .api .extension .BeforeAllCallback ;
19- import org .junit .jupiter .api .extension .ExtendWith ;
2021import org .junit .jupiter .api .extension .ExtensionContext ;
22+ import org .junit .jupiter .api .fixtures .TrackLogRecords ;
2123import org .junit .jupiter .engine .config .JupiterConfiguration ;
2224import org .junit .jupiter .engine .extension .ExtensionRegistry ;
25+ import org .junit .platform .commons .logging .LogRecordListener ;
2326import org .junit .platform .launcher .core .NamespacedHierarchicalStoreProviders ;
27+ import org .junit .platform .testkit .engine .ExecutionRecorder ;
2428
2529class ResourceAutoClosingTests {
2630
@@ -60,6 +64,24 @@ void shouldNotCloseAutoCloseableWhenAutoCloseEnabledIsFalse() throws Exception {
6064 assertThat (resource .closed ).isFalse ();
6165 }
6266
67+ @ Test
68+ void shouldLogWarningWhenClosingResourceImplementsCloseableResourceButNotAutoCloseable (
69+ @ TrackLogRecords LogRecordListener listener ) throws Exception {
70+ ExecutionRecorder executionRecorder = new ExecutionRecorder ();
71+ CloseableResource resource = new CloseableResource ();
72+ String msg = "Type implements CloseableResource but not AutoCloseable: " + resource .getClass ().getName ();
73+ when (configuration .isAutoCloseEnabled ()).thenReturn (true );
74+
75+ ExtensionContext extensionContext = new JupiterEngineExtensionContext (executionRecorder , testDescriptor ,
76+ configuration , extensionRegistry , launcherStoreFacade );
77+ ExtensionContext .Store store = extensionContext .getStore (ExtensionContext .Namespace .GLOBAL );
78+ store .put ("resource" , resource );
79+
80+ ((AutoCloseable ) extensionContext ).close ();
81+ assertThat (listener .stream (Level .WARNING )).map (LogRecord ::getMessage ).anyMatch (msg ::equals );
82+ assertThat (resource .closed ).isTrue ();
83+ }
84+
6385 static class AutoCloseableResource implements AutoCloseable {
6486 private boolean closed = false ;
6587
@@ -69,19 +91,13 @@ public void close() {
6991 }
7092 }
7193
72- static class AutoCloseableResourceStoreUsingExtension implements BeforeAllCallback {
73- @ Override
74- public void beforeAll (ExtensionContext context ) {
75- var store = context .getStore (ExtensionContext .Namespace .GLOBAL );
76- store .put ("resource" , new AutoCloseableResource ());
77- }
78- }
94+ @ SuppressWarnings ("deprecation" )
95+ static class CloseableResource implements ExtensionContext .Store .CloseableResource {
96+ private boolean closed = false ;
7997
80- @ SuppressWarnings ("JUnitMalformedDeclaration" )
81- @ ExtendWith (AutoCloseableResourceStoreUsingExtension .class )
82- static class AutoCloseableTestCase {
83- @ Test
84- void dummyTest () {
98+ @ Override
99+ public void close () {
100+ closed = true ;
85101 }
86102 }
87103}
0 commit comments