UpdaterTreeNode extends DefaultMutableTreeNode implements Comparable<UpdaterTreeNode>, SdkUpdaterConfigPanel.MultiStateRow { abstract protected void setState(PackageNodeModel.SelectedState state);  abstract PackageNodeModel.SelectedState getInitialState(); abstract PackageNodeModel.SelectedState getCurrentState(); final void resetState(); boolean includeInSummary(); boolean isPrimary(); @Override final void cycleState(); @NotNull String getStatusString(); @Override int compareTo(@NotNull UpdaterTreeNode o); void customizeRenderer(Renderer renderer,
                                JTree tree,
                                boolean selected,
                                boolean expanded,
                                boolean leaf,
                                int row,
                                boolean hasFocus);  }
@Test public void testDetailsTreeNodeListener() throws Exception { UpdatablePackage updatablePackage = new UpdatablePackage(new FakePackage.FakeLocalPackage("foo")); ChangeListener listener = Mockito.mock(ChangeListener.class); DetailsTreeNode node = new DetailsTreeNode(new PackageNodeModel(updatablePackage), listener, myConfigurable); node.setState(NOT_INSTALLED); ArgumentCaptor<ChangeEvent> argument = ArgumentCaptor.forClass(ChangeEvent.class); Mockito.verify(listener).stateChanged(argument.capture()); assertEquals(node, argument.getValue().getSource()); }