2015-11-22 7 views
6

у меня есть отключенный JTable, который предоставляет всплывающее меню:Нажатие на инвалидов компонентов Swing,

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); 
     } 
    } 
} 

Так при тестировании этой функции с AssertJ Качели с помощью:

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> 

Он работает нормально, когда таблица включена. Но (тест popupShoudBeOpened) на столе инвалидов бросает следующее исключение:

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) 

Как всплывающее меню, очевидно, работает даже на столе инвалидов, как я могу получить AssertJ к «правой кнопкой мыши» инвалидов таблицы?

+0

вы можете разместить свой код, пожалуйста? – bircastri

+0

Это assertj, который генерирует исключение, поскольку он ожидает, что таблица будет включена. Просьба предоставить полный список исключений. –

+0

@bircastri Я переложил проблему на основы и предоставил весь стек. Замечательно видеть, что есть люди, которые используют AssertJ Swing. –

ответ

1

AsserJ ожидал, что тестируемый компонент будет включен.
Как только он отключен, он выкинет исключение IllegalStateException.
Check AbstractComponentFixture API here.

Одним из способов решения этой проблемы является разделить на 2 испытаний и содержат исключение, когда таблица, как ожидается, будут отключены:

@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

Thanx для решения моей проблемы. Проблема в том, что всплывающее меню все равно не открывается. Но мне нужно открыть его, чтобы щелкнуть элемент меню. Есть ли способ отключить предварительные проверки AssertJ? –

+0

Добро пожаловать. Проблема в том, что компонент драйвера всегда будет проверять отображение EDT + + +. Если вы не измените исходный код, эти 3 preconditon должны быть выполнены перед тестом. –

Смежные вопросы