2015-11-22 4 views
6

ich ein behindertes JTable, die ein Popup-Menü bietet:Anklicken deaktiviert Swing-Komponenten

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JMenuItem; 
import javax.swing.JPopupMenu; 
import javax.swing.JTable; 

public class DisabledTableFrame extends JFrame { 

    public DisabledTableFrame() { 

     setSize(200, 100); 
     setTitle(getClass().getCanonicalName()); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     JTable table = new JTable(); 
     add(table); 

     table.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mousePressed(MouseEvent e) { 
       mouseReleased(e); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       new PopupMenu(); 
      } 

     }); 

     table.setEnabled(false); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new DisabledTableFrame(); 

    } 

    private class PopupMenu extends JPopupMenu { 

     public PopupMenu() { 

      JMenuItem menuItem = new JMenuItem("TEST"); 
      add(menuItem); 
      setVisible(true); 
     } 
    } 
} 

also beim Testen dieser Funktion mit AssertJ Schaukel mit:

import org.assertj.swing.edt.GuiActionRunner; 
import org.assertj.swing.edt.GuiQuery; 
import org.assertj.swing.fixture.FrameFixture; 
import org.assertj.swing.junit.testcase.AssertJSwingJUnitTestCase; 
import org.junit.Test; 

public class PopupTestCase extends AssertJSwingJUnitTestCase { 

    protected FrameFixture window; 

    @Override 
    protected void onSetUp() { 
     DisabledTableFrame mainFrame = GuiActionRunner 
       .execute(new GuiQuery<DisabledTableFrame>() { 
        protected DisabledTableFrame executeInEDT() { 

         return new DisabledTableFrame(); 
        } 
       }); 

     window = new FrameFixture(robot(), mainFrame); 
    } 

    @Test 
    public void popupShouldBeOpened() { 

     window.table().showPopupMenu(); 
    } 
} 

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>AssertJSwingInactiveTest</groupId> 
    <artifactId>AssertJSwingInactiveTest</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>org.assertj</groupId> 
      <artifactId>assertj-swing-junit-4.5</artifactId> 
      <version>1.2.0</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <sourceDirectory>src</sourceDirectory> 
     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Es funktioniert gut, wenn die Tabelle aktiviert ist. Aber die popupShoudBeOpened (Test) auf der untauglichen Tabelle führt die folgende Ausnahme:

java.lang.IllegalStateException: Expecting component javax.swing.JTable[name=null, rowCount=0, columnCount=0, enabled=false, visible=true, showing=true] to be enabled 
at org.assertj.swing.driver.ComponentPreconditions.checkEnabled(ComponentPreconditions.java:68) 
at org.assertj.swing.driver.ComponentPreconditions.checkEnabledAndShowing(ComponentPreconditions.java:48) 
at org.assertj.swing.driver.ComponentDriver$2.executeInEDT(ComponentDriver.java:555) 
at org.assertj.swing.edt.GuiTask.run(GuiTask.java:38) 
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:745) 
at java.awt.EventQueue.access$300(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:706) 
at java.awt.EventQueue$3.run(EventQueue.java:704) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:715) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
at org.assertj.swing.edt.GuiActionRunner.execute(GuiActionRunner.java:103) 
at org.assertj.swing.driver.ComponentDriver.checkInEdtEnabledAndShowing(ComponentDriver.java:552) 
at org.assertj.swing.driver.ComponentDriver.invokePopupMenu(ComponentDriver.java:519) 
at org.assertj.swing.fixture.AbstractJPopupMenuInvokerFixture.showPopupMenu(AbstractJPopupMenuInvokerFixture.java:95) 
at GUITestCase.popupShouldBeOpened(GUITestCase.java:27) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) 
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:220) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Wie das Popup-Menü offensichtlich auch auf der untauglichen Tabelle funktioniert, wie kann ich AssertJ auf „Rechtsklick“ Behinderte Tisch?

+0

können Sie Ihren Code schreiben Sie? – bircastri

+0

Es ist assertj, wer die Ausnahme auslöst, da erwartet wird, dass die Tabelle aktiviert ist. Bitte geben Sie die vollständige Ausnahmespur an. –

+0

@bircastri Ich destillierte das Problem zu den Grundlagen und lieferte den gesamten StackTrace. Schön zu sehen, dass es immer noch Leute gibt, die AssertJ Swing benutzen. –

Antwort

1

AsserJ erwartet, dass die getestete Komponente aktiviert wird.
Sobald es deaktiviert ist, wird es eine IllegalStateException auslösen.
Überprüfen AbstractComponentFixture API here.

Eine Möglichkeit, dieses Problem zu beheben, ist für zwei Tests zu unterteilen und die Ausnahme enthalten, wenn die Tabelle gesperrt werden soll:

@Test 
public void popupShouldBeOpenedIfTableIsDisabled() { 
    try { 
     window.table().showPopupMenu(); 
    } catch (IllegalStateException e) { 
     // Continue normally if IllegalStateException was thrown since the table is disabled on purpose. 
    } 
} 

@Test 
public void popupShouldBeOpenedIfTableIsEnabled() { 
    window.table().showPopupMenu(); 
    // IllegalStateException will fail the test since the table is enabled. 
} 
+0

Danke für den Umgang mit meinem Problem. Das Problem ist, dass das Popup-Menü nicht geöffnet wird. Aber ich muss es öffnen, um auf einen Menüpunkt zu klicken. Gibt es eine Möglichkeit, die Vorbedingungsprüfungen von AssertJ zu deaktivieren? –

+0

Gern geschehen. Problem ist, dass die Treiberkomponente immer nach EDT + aktiviert + zeigt. Wenn Sie den Quellcode nicht ändern, müssen diese drei Bedingungen vor dem Test erfüllt sein. –

Verwandte Themen