Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Empty component hierarchy sometimes

Open
#157 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
25/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
java

Research direction

Start with AdhocTradeEntryDlgTest.testAmendETFuture and its setupDialog() helper, then run it under CacioTestRunner on Linux to reproduce the intermittent empty hierarchy. Trace the failure through DialogFixture and BasicComponentFinder, and compare runs with and without pack(). Done means the cause is identified and the test no longer intermittently fails to find amendmentReasonLabel.

Written by the indexing model from the issue text.

Description

bug

This is probably more suited to a mailing list / forum, but the mail list comment appeared to point me here.
I have a unit test which tests a dialog. I am using cacio-tta to enable it to run headless. This seems to run reliably in Windows and much of the time in Linux ... but maybe half of the time in linux the component lookup fails. When it fails, the component hierarchy is empty.

The failure looks as follows (I am running under junit4 with the CacioTestRunner)

org.assertj.swing.exception.ComponentLookupException: Unable to find component using matcher org.assertj.swing.core.NameMatcher[name='amendmentReasonLabel', type=javax.swing.JLabel, requireShowing=true].

Component hierarchy:
com.ccm.backtest.fund.AdhocTradeEntryDlg[name='dialog1', title='Amend Trade', enabled=true, modal=true, visible=true, showing=true]

    at org.assertj.swing.core.BasicComponentFinder.componentNotFound(BasicComponentFinder.java:290)
    at org.assertj.swing.core.BasicComponentFinder.find(BasicComponentFinder.java:275)
    at org.assertj.swing.core.BasicComponentFinder.find(BasicComponentFinder.java:268)
    at org.assertj.swing.core.BasicComponentFinder.findByName(BasicComponentFinder.java:203)
    at org.assertj.swing.fixture.AbstractContainerFixture.findByName(AbstractContainerFixture.java:622)
    at org.assertj.swing.fixture.AbstractContainerFixture.label(AbstractContainerFixture.java:291)
    at com.ccm.backtest.fund.AdhocTradeEntryDlgTest.testAmendETFuture(AdhocTradeEntryDlgTest.java:103)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)

The relevant test code that is failing is...

    @Test
    public void testAmendETFuture()
    {
        MockAssetFactory assetFactory = new MockAssetFactory();
        Date today = java.sql.Date.valueOf("2015-01-02");
        ETFuture future = new ETFuture(today, assetFactory.get("FTH16"), 2, Side.SELL, 1.234, today);
        future.setBrokerageFee(2.34, assetFactory.get("CAD"));
        future.setClearingFee(5.67, assetFactory.get("EUR"));
        setupDialog("book", future, assetFactory, AdhocTradeEntryDlg.Operation.AMEND);

        dialogFixture.label("amendmentReasonLabel").requireVisible();

where the setupDialog() code looks like:

    private void setupDialog(String book, Transaction trade, IAssetFactory assetFactory, AdhocTradeEntryDlg.Operation operation)
    {
        dialog = GuiActionRunner.execute(new GuiQuery<AdhocTradeEntryDlg>()
        {
            protected AdhocTradeEntryDlg executeInEDT()
            {
                AdhocTradeEntryDlg dlg = new AdhocTradeEntryDlg(book, trade, assetFactory, operation);
                dlg.pack();
                return dlg;
            }
        });

        // IMPORTANT: note the call to 'robot()'
        // we must use the Robot from AssertJSwingJUnitTestCase
        dialogFixture = new DialogFixture(robot(), dialog);
        dialogFixture.show(new Dimension(800, 800));
    }

I added the pack() call which makes the issue appear less often ... and so I am guessing there is a synchronisation issue at play here. The other interesting thing is that there are 4 almost identical tests in this test case - they all call setupDialog (it's not in onSetUp because there is more than one flavor as I require different tests to call different constructors for the object).
What would be a good way to debug this?

Ian

Dominant language
Java
Stars
121
Forks
52
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from assertj/assertj-swing

All issues in assertj/assertj-swing

Similar issues

More Java issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.