Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Swingoberfläche mit FEST testen.

  1. #1
    Registrierter Benutzer
    Registriert seit
    01.12.2006
    Beiträge
    32

    Swingoberfläche mit FEST testen.

    Hallo Java-Entwickler,

    ich hoffe, daß mir hier jemand weiter helfen kann. Ich habe den Auftrag erhalten, die Swingoberfläche unserer Applikation, mit FEST zu testen. (Bisher habe ich dafür UISpec4J verwendet). Leider komme ich mit den Beispielen auf der Homepage von FEST nicht weiter.
    Vielleicht kennt sich hier ja jemand damit aus.

    In unserer Applikation wird eine Swingoberfläche über die main-Methode gestartet. Hier der Code für den Client. VFrame ist von JFrame angeleitet.
    Code:
    public class VClient {
    	
    	private static VFrame vf=null;
    	
    	public static void main(String[] args) {
    		try {
    			init();
    			vf.start();
    		} catch (Exception ex) {
    			ex.printStackTrace();
    		}
    	}
    	/**
    	 * Diese Methode wird anstelle des Konstruktors verwendet.
    	 */
    	public static void init(){
    		IVApplicationController appCont=new VApplicationControllerImpl();
    		vf=new VFrame(appCont);
    	}
    	/*
    	 * Diese Methode wurde nur für Testzwecke eingeführt
    	 */
    	public static VFrame getVFrame(){
    		return vf;
    	}
    }
    Nun meine Frage: Wie muß ich den Test initialisieren, um zB auf Componenten von VFrame zu greifen zu können?

    mfg
    anunnaki

  2. #2
    Registrierter Benutzer
    Registriert seit
    01.12.2006
    Beiträge
    32
    Nun hatte ich mal wieder Zeit, mich um dieses Problem zu kümmern. Hier eine Lösung wie ich sie mir erarbeitet habe. Möge sie anderen hilfreich sein.

    In einer main-Methode wird ein JFrame erzeugt, in den eine Instanz meiner Klasse MyPanel eingefügt wird. MyPanel ist wiederum von JPanel abgeleitet und enthält einen Button und ein Textfeld. Ähnlich wie das Beispiel auf der FEST-Seite.
    Wenn die Applikation gestartet wird, steht im Textfeld eine Zeichenkette, die ungefähr so aussieht: "xxxxxxxxx". Wird auf den Button geklickt, wird in das Textfeld die Zeichenkette "eingabe" geschrieben.

    Meine Schwierigkeit war nun, wie erhalte ich auf den JFrame zugriff, wenn ich eine Applikation starte. Zuerst einmal hier der Code:

    Applikation:

    Code:
    package org.fest.demo;
    
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class JavaApp{
    	
    	
    	  public static void main(String[] args) {
    	    SwingUtilities.invokeLater(new Runnable() {
    	      public void run() {
    	    	System.out.println("============started");
    	        JFrame frame = new JFrame("Java Application");
    	        MyPanel panel=new MyPanel();
    	        frame.add(panel);
    	        frame.setSize(300, 200);
    	        frame.setVisible(true);
    	      }
    	    });
    	  }
    	}
    Hier der eingefügte Panel:

    Code:
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class MyPanel extends JPanel implements ActionListener{
    
    	private JButton button;
    	private JTextField textField;
    	
    	public MyPanel(){
    		setName("inner_panel");
    		button=new JButton("ABC");
    		button.setName("button");
    		button.addActionListener(this);
    		textField=new JTextField();
    		textField.setText("xxxxxxxxxxxxxxxxx");
    		textField.setName("textfield");
    		add(button);
    		add(textField);
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent ae) {
    		textField.setText("eingabe");
    	}
    }
    Und hier die Testklasse:

    Code:
    package org.fest.demo;
    
    import java.awt.Frame;
    
    import javax.swing.JFrame;
    import javax.swing.text.JTextComponent;
    
    import org.fest.swing.annotation.RunsInEDT;
    import org.fest.swing.core.GenericTypeMatcher;
    import org.fest.swing.core.Robot;
    import org.fest.swing.finder.FrameFinder;
    import org.fest.swing.finder.WindowFinder;
    import org.fest.swing.fixture.FrameFixture;
    import org.fest.swing.fixture.JButtonFixture;
    import org.fest.swing.fixture.JPanelFixture;
    import org.fest.swing.fixture.JTextComponentFixture;
    import org.fest.swing.junit.testcase.FestSwingJUnitTestCase;
    import org.junit.Test;
    
    import static org.fest.swing.launcher.ApplicationLauncher.*;
    import static org.junit.Assert.*;
    
    
    public class JavaAppTest extends FestSwingJUnitTestCase{
    	
    	private FrameFixture frame=null;
    	
    	@Override
    	protected void onSetUp() {
    		application(JavaApp.class).start();
    		frame =WindowFinder.findFrame(new GenericTypeMatcher<JFrame>(JFrame.class) {
    			  protected boolean isMatching(JFrame frame) {
    			    return "Java Application".equals(frame.getTitle()) && frame.isShowing();
    			  }
    			}).using(robot());
    	}
    	@Test
    	public void testMainFrame(){
    		assertNotNull(frame);
    	}
    	@Test
    	public void testInnerPanel(){
    		JPanelFixture jpf=frame.panel("inner_panel");
    		assertNotNull(jpf);
    	}
    	@Test
    	public void testButton(){
    		JButtonFixture jbf=frame.button("button");
    		assertNotNull(jbf);
    	}
    	@Test
    	public void testTextField(){
    		JTextComponentFixture jtf=frame.textBox("textfield");
    		assertNotNull(jtf);
    	}
    	@Test
    	public void testClickButton(){
    		JButtonFixture jbf=frame.button("button");
    		jbf.click();
    		JTextComponentFixture jtf=frame.textBox("textfield").requireText("eingabe");
    	}
    }
    Eigendlich funktioniert es genau so wie auf der http://docs.codehaus.org/pages/viewp...geId=117900196-Seite beschreiben. Mein Problem lag wohl im GenericTypeMatcher. So funktioniert es jedenfalls.

    Der Frame wird hier über den Titel identifiziert. Alle anderen Komponenten werden über den Componentnamen gefunden.

    Hier noch die verwendeten Liraries:

    debug-1.0.jar
    fest-assert-1.1.jar
    fest-reflect-1.1.jar
    fest-swing-1.2a3-sources.jar
    fest-swing-1.2a3.jar
    fest-swing-junit-1.2a3-sources.jar
    fest-swing-junit-1.2a3.jar
    fest-swing-junit-4.5-1.2a3-sources.jar
    fest-swing-junit-4.5-1.2a3.jar
    fest-util-1.1-sources.jar
    fest-util-1.1.jar
    jcip-annotations-1.0.jar
    Geändert von anunnaki (17-03-2010 um 15:51 Uhr) Grund: Libraries zugefügt

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •