Amis qui aimez les défis, en voici un !

Je vais vous énoncer, dans ce petit roman, les misères que me font ces deux petits...

A l'origine des temps, il m'a été donné de faire des tests de GUI java avec Abbot (qui est donc un tester de GUI java) ! Voici ce que j'avais comme source, tout fonctionnait à merveille...

source 1 : GUI a tester...

Ce petit programme nous montre une fenêtre avec 2 JTextField, 1 JButton et 1 JLabel. En cliquant sur le bouton, ce qu'il y a d'écrit dans les 2 champs de texte apparaissent dans le label ; sugoi desu ne (super n'est-ce pas) !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package appli;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class monAppli extends JPanel {

    /**
     * @author Lynk HIROSUE
     */

    private static final long serialVersionUID = -4022424656891074136L;

    public monAppli() {
        buildFrame();
    }

    private static void buildFrame() {
        JFrame myFrame = new JFrame("App");
        final Container myPanneau = myFrame.getContentPane();

        myPanneau.setLayout(new GridLayout(4, 1, 0, 0));

        JButton whoIAm = new JButton("qui suis-je ?");
        final JLabel resultat = new JLabel();
        final JTextField nom = new JTextField("HIROSUE");
        final JTextField prenom = new JTextField("Lynk");

        nom.setName("nom");
        prenom.setName("prenom");

        myPanneau.add(nom);
        myPanneau.add(prenom);
        myPanneau.add(whoIAm);
        myPanneau.add(resultat);

        myFrame.pack();
        myFrame.setVisible(true);

        whoIAm.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                myPanneau.remove(nom);
                myPanneau.remove(prenom);
                resultat.setText(nom.getText() + " " + prenom.getText());
            }

        });

    }

    public static void main(String[] args) {
        buildFrame();
    }
}
Voilà, j'ai pris du temps à tout coloriser, mais c'est plus agréable à lire comme ça !

Source 2 : test Abbot

Voici maintenant la source des tests (enfin, du test). dans ce test, je fais une action "cliquer" sur le bouton et je vérife que ce que j'ai dans le label correspond bien à ce que j'ai entré dans les 2 champs de texte.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package test;
import appli.MonAppli;

import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;

import abbot.finder.ComponentNotFoundException;
import abbot.finder.MultipleComponentsFoundException;
import abbot.finder.matchers.ClassMatcher;
import abbot.finder.matchers.NameMatcher;
import abbot.tester.JButtonTester;
import junit.extensions.abbot.ComponentTestFixture;
import junit.extensions.abbot.TestHelper;


public class MonAppliTest extends ComponentTestFixture {
    
    public void testWhoIAm(){
        final MonAppli ma = new MonAppli();
        showFrame(ma);
        
        Component bouton = null;
        Component label = null;
        Component txt1 = null;
        Component txt2 = null;
        
        try {
            bouton = getFinder().find(new ClassMatcher(JButton.class));
            label = getFinder().find(new ClassMatcher(JLabel.class));
            txt1 = getFinder().find(new NameMatcher("nom"));
            txt2 = getFinder().find(new NameMatcher("prenom"));

        } catch (ComponentNotFoundException e) {
            System.err.println("No component found : " + e);
        } catch (MultipleComponentsFoundException e) {
            System.err.println("More than one component found : " + e);
        }
        
        JButtonTester tester = new JButtonTester();
        
        tester.actionClick(bouton);
        assertEquals("Wrong way!","HIROSUE Lynk", ((JLabel)label).getText());
        
        assertEquals("Bad","HIROSUE", ((JTextField)txt1).getText());
        assertEquals("Bad","Lynk", ((JTextField)txt2).getText());
        
    }
    
    public MonAppliTest(String name){
        super(name); 
    }

    public static void main(String[] args) {
        TestHelper.runTests(args, MonAppliTest.class);
    }

}
Voilà !

Jusqu'ici, tout fonctionnait. Mais, (et oui, sinon c'est pas drôle), depuis que je l'ai mis sur maven 2, il ne m'aime plus... Les deux librairie que j'utilisais (JUnit 3.8.1 et Abbot 1.0.0rc2) sont à présent dans les dependencies sauf que la librairie Abbot est de version 0.13.0, j'ai donc repris mon ancien Abbot et renommé celui-ci et remis dans le repository local, l'erreur qu'il me faisait avec l'ancienne version n'apparait plus ; je passe ce passage...

Donc, voici comment est fait mon projet avec maven 2. Les deux source (source 1 et source 2) sont les mêmes.

Mon pom.xml est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>mavenTest</groupId>
    <artifactId>mavenTest</artifactId>
    <name>maven test with Abbot developpement</name>
    <version>1.1</version>
    <description>my test to understand Maven2</description>
    <developers>
        <developer>
            <id>ndurand</id>
            <name>Mon nom</name>
            <email>monMail@monEntreprise.com</email>
            <organization>monEntreprise</organization>
        </developer>
    </developers>
    <scm>
        <connection>connexionsecrète</connection>
        <developerConnection>
            developerConnectionSecret</developerConnection>
        <url>urlSecrèteAussi</url>
    </scm>
    <build>
        <resources>
            <resource>
                <directory>src/main/java/appli</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/test</directory>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>appli.monAppli</mainClass>
                            <packageName>swing</packageName>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>abbot</id>
            <name>abbot</name>
            <url>http://uneUrl.com</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>abbot</groupId>
            <artifactId>abbot</artifactId>
            <version>0.13.0</version>
        </dependency>
    </dependencies>
</project>
Voilà, et voici la disposition de mon projet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
/mavenTest [mavenTest]
|
+-/src/main/java
||
|+-/appli
|||
||+-monAppli.java
||
+-JRE System Library [jre1.5.0_06]
|
+-/src/test/
||
|+-/test
|||
||+-monAppliTest.java
|
+-/Maven2 Dependencies
||
|+-abbot-0.13.0.jar
|+-junit-3.8.1.jar
|
+-/src
||
|+-/main
|
+-pom.xml
et voici ma belle erreur (dans JUnit, lorsque je lance le test...)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
java.lang.NoClassDefFoundError: org/jdom/JDOMException
    at junit.extensions.abbot.ResolverFixture.fixtureSetUp(ResolverFixture.java:63)
    at junit.extensions.abbot.ComponentTestFixture.fixtureSetUp(ComponentTestFixture.java:335)
    at junit.extensions.abbot.ResolverFixture.runBare(ResolverFixture.java:89)
    at junit.extensions.abbot.ComponentTestFixture.runBare(ComponentTestFixture.java:399)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Voilà, mesdames, mesdemoiselles, messieurs...

A vos méninges !!!