AssertJ Swing - 杀死所有固定装置

AssertJ Swing - kill all fixtures

有没有一种方法可以杀死所有 AssertJ 创建的装置,或者如何在创建新装置时防止挂起?在尝试将大量遗留 GUI 测试迁移到 AssertJ Swing 时,我不得不经常面临以下僵局:

"main" #1 prio=5 os_prio=0 tid=0x0000000002080000 nid=0x9c waiting on condition [0x00000000024cd000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x0000000547049720> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at org.assertj.swing.lock.ScreenLock.acquire(ScreenLock.java:57)
    at org.assertj.swing.core.BasicRobot.acquireScreenLock(BasicRobot.java:164)
    at org.assertj.swing.core.BasicRobot.robotWithCurrentAwtHierarchy(BasicRobot.java:153)
    at org.assertj.swing.fixture.AbstractWindowFixture.<init>(AbstractWindowFixture.java:119)
    at org.assertj.swing.fixture.FrameFixture.<init>(FrameFixture.java:43)

这当然是由于错误使用 fixtures 造成的,当一个新的 fixture 被创建而另一个仍然处于活动状态时。但是,这种僵局使迁移变得复杂。

在对框架进行了更多探索后,我意识到

  • 我不需要使用锁定
  • 如果我自己创建机器人,是可以解除锁定的

现在我使用这段代码来创建夹具:

assertJRobot = BasicRobot.robotWithCurrentAwtHierarchy();
frameFixture = new FrameFixture(assertJRobot, appFrame());

当我需要创建另一个夹具时,这段代码,而另一个测试没有释放锁,而是关闭了 windows,并清理了其他所有东西:

assertJRobot.cleanUpWithoutDisposingWindows();