JUnit Test Issues with 2025.2

Hi. I’m doing some work to update my plugin to support 2025.2. I am able to run a virtual instance of the IDE just fine and am working through getting my test suite to pass.

For a sizable subset of my tests, I am seeing some thread leak errors as a cause of failure. Any ideas as to what might be happening?

I’m using the following dependencies and their respective version

  • gradle-intellij-plugin - 2.10.1
  • junit - 5.7.0

Here’s an example stack trace:

java.lang.AssertionError: Thread leaked: Thread[#50,Timer-4,5,main] (alive) TIMED_WAITING
--- its stacktrace:
 at java.base/java.lang.Object.wait0(Native Method)
 at java.base/java.lang.Object.wait(Object.java:366)
 at java.base/java.util.TimerThread.mainLoop(Timer.java:563)
 at java.base/java.util.TimerThread.run(Timer.java:516)
---
stackTrace.length: 4

Leaking threads dump:
"Timer-4" (alive) TIMED_WAITING
	at java.base/java.lang.Object.wait0(Native Method)
	at java.base/java.lang.Object.wait(Object.java:366)
	at java.base/java.util.TimerThread.mainLoop(Timer.java:563)
	at java.base/java.util.TimerThread.run(Timer.java:516)


----
All other threads dump:
"AppKit Thread" (alive) RUNNABLE

"Common-Cleaner" (alive) TIMED_WAITING
	at java.base/jdk.internal.misc.Unsafe.park(Native Method)
	at java.base/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:269)
	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1852)
	at java.base/java.lang.ref.ReferenceQueue.await(ReferenceQueue.java:71)
	at java.base/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:143)
	at java.base/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:218)
	at java.base/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
	at java.base/java.lang.Thread.run(Thread.java:1583)
	at java.base/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:186)

"Signal Dispatcher" (alive) RUNNABLE

"Timer-3" (alive) TIMED_WAITING
	at java.base/java.lang.Object.wait0(Native Method)
	at java.base/java.lang.Object.wait(Object.java:366)
	at java.base/java.util.TimerThread.mainLoop(Timer.java:563)
	at java.base/java.util.TimerThread.run(Timer.java:516)

"/127.0.0.1:58249 to /127.0.0.1:58244 workers" (alive) WAITING
	at java.base/jdk.internal.misc.Unsafe.park(Native Method)
	at java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:371)
	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
	at java.base/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:4013)
	at java.base/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3961)
	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1712)
	at org.gradle.internal.remote.internal.hub.queue.EndPointQueue.take(EndPointQueue.java:49)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:403)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1583)

"AWT-EventQueue-0" (alive) WAITING
	at java.base/jdk.internal.misc.Unsafe.park(Native Method)
	at java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:371)
	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
	at java.base/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:4013)
	at java.base/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3961)
	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1712)
	at java.desktop/java.awt.EventQueue.getNextEvent(EventQueue.java:573)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:194)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

Looks like it is related to my usage of a Timer within my plugin for those that might run into a similar issue.