private void createDialog(SpyExecutor dialogExecutor) throws Exception {
		executor = dialogExecutor;

		tool = new DummyPluginTool();
		tool.setVisible(true);

		List<Address> addresses = new ArrayList<>();
		ToyProgramBuilder builder = new ToyProgramBuilder("Test", true);
		builder.createMemory(".text", "0x0", 0x110);
		Function f = createFunction(builder, 0x00);
		addresses.add(f.getEntryPoint());
		f = createFunction(builder, 0x10);
		addresses.add(f.getEntryPoint());
		f = createFunction(builder, 0x20);
		addresses.add(f.getEntryPoint());
		f = createFunction(builder, 0x30);
		addresses.add(f.getEntryPoint());
		f = createFunction(builder, 0x40);
		addresses.add(f.getEntryPoint());
		f = createFunction(builder, 0x50);
		addresses.add(f.getEntryPoint());

		Program program = builder.getProgram();
		Navigatable navigatable = new TestDummyNavigatable();
		runSwing(() -> dialog =
			new TableChooserDialog(tool, executor, program, "Dialog Title", navigatable));

		testAction = new TestAction();
		dialog.addAction(testAction);

		dialog.addCustomColumn(new OffsetTestColumn());
		dialog.addCustomColumn(new SpaceTestColumn());

		dialog.show();
		waitForDialogComponent(TableChooserDialog.class);
		loadData(addresses);
	}
Interface for tests to signal what is expected of the executor
Ghidra/Features/Base/src/test.slow/java/ghidra/app/tablechooser/TableChooserDialogTest.java