Je cherche a effectuer des tests unitaires et fonctionnels sur une application java, que je n'ai pas moi meme codee, comprenant des composants Swing. J'ai choisi d'utiliser la "library" UISpec4J qui me paraissait assez bien concue pour cet usage.

Je souhaite verifier que la fentre permettant de se logger reagit bien comme prevu (messages d'erreurs differents en fonction de l'absence du login ou de l'utilisation d'un login n'existant pas)

Apres avoir lu la doc sur le site web d'UISpec4J, j'ai trouve une facon d'intercepter une "window" : http://www.uispec4j.org/interception.html

J'ai donc tente d'utiliser cette fonctionnalite pour capturer la fenetre login de mon application. Pour cela, je lance l'application principale dans la classe UISpecAdapter (http://www.uispec4j.org/apidocs/org/...ecAdapter.html) puis je cree une JWindow grace au Jpanel LoginPanel lance precedemment comme inscrit sur le site de UISpec4J.



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
public class Adapter implements UISpecAdapter {
 
 
    public org.uispec4j.Window getMainWindow()
    {
	//lance l'application
        lanceWindow();
 
	//recupere le Jpanel puis cree une JWindow
        LoginPanel logpanel=LoginPanel.getInstance();
        JWindow window = new JWindow();
        window.getContentPane().add(logpanel);
 
        //affiche ce JWindow
        window.show();
 
	//cree la Window de UISpec4J et y affecte la JWindow
	org.uispec4j.Window uispec4jwin = new org.uispec4j.Window(window);
        return uispec4jwin;
    }
}
Dans ma fonction test, j'utilise ensuite la fonctionnalite WindowInterceptor et appelle la fonction getMainWindow.

J'essaie ensuite de simuler l'appui de differentes touches puis de tester la validite de mon message.

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
72
public class TestLoginPanel extends UISpecTestCase
{
    static
    {
        UISpec4J.init();
    }
 
    static LoginPanel logpanel=LoginPanel.getInstance();
 
    public TestLoginPanel()
    {
        super(new Adapter());
    }
 
    public void testLoginFailed() throws AWTException
    {
        try {
 
                Window appWindow = WindowInterceptor.run(new Trigger()
                {
                    public void run()
                    {
                       getMainWindow();
                    }
                });
 
 
                //simuler l'appui d'une touche grace a la classe Robot
                Robot rob = new Robot();
 
                //login
                rob.keyPress(KeyEvent.VK_A);
                rob.keyRelease(KeyEvent.VK_A);
                rob.keyPress(KeyEvent.VK_B);
                rob.keyRelease(KeyEvent.VK_B);
 
               //Tab pour aller jusqu'au champ password
                rob.keyPress(KeyEvent.VK_TAB);
                rob.keyRelease(KeyEvent.VK_TAB);
 
                //password
                rob.keyPress(KeyEvent.VK_A);
                rob.keyRelease(KeyEvent.VK_A);
                rob.keyPress(KeyEvent.VK_A);
                rob.keyRelease(KeyEvent.VK_A);
 
                //tab puis entrer pour valider
                rob.keyPress(KeyEvent.VK_TAB);
                rob.keyRelease(KeyEvent.VK_TAB);
                rob.keyPress(KeyEvent.VK_ENTER);
                rob.keyRelease(KeyEvent.VK_ENTER);
 
               //entrer pour fermer le Message d'erreur
                rob.keyPress(KeyEvent.VK_ENTER);
                rob.keyRelease(KeyEvent.VK_ENTER);
 
 
                //UISpec4J
                JTextComponent jt = new JTextPane();
                jt.setText(logpanel.getJOptionPaneInstance().getName());
                TextBox box = new TextBox(jt);
 
                box.assertTextEquals("Login Failed");
 
            }
            catch (SecurityException e)
            {
		System.err.println(e.getMessage());
	    }
    }
 
}


Lorsque je lance le test, la fenetre JUnit apparait ainsi qu'une version de ma fenetre login denuee de tout caracteres mais fonctionnant nomalement (ce qui est deja bizarre). La simulation de l'appui sur les touches ne fonctionne pas du tout mais je peux moi meme appuyer sur des touches et tester manuellement les differentes possibilites. Une fois que j'ai termine, je ferme la fenetre login et Junit affiche cette erreur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
junit.framework.AssertionFailedError: No window was shown (timeout expired)
  at org.uispec4j.interception.handlers.ShownInterceptionDetectionHandler.waitWindow(ShownInterceptionDetectionHandler.java:31)
  at org.uispec4j.interception.WindowInterceptor.run(WindowInterceptor.java:239)
  at ui.securityinterface.TestLoginPanel.testLoginFailed(TestLoginPanel.java:252)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)


Je ne sais pas comment resoudre ce probleme et le code de l'application est difficilement comprehensible. Si quelqu'un a une solution magique a me proposer, j'en serais ravie! Il est tres difficile de trouver de la documentation sur les tests des composants Swing et encore plus sur UISpec4J...