Java - Test Swing avec AssertJ

Le programme Java Swing Ă  tester

import java.awt.FlowLayout;

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

public class App {

  public static void main(String[] args) {

    // Le champ texte
    JTextField nameTextField = new JTextField(15);
    nameTextField.setName("firstname-textfield");

    // Le bouton
    JButton sayHelloBtn = new JButton("Dire bonjour");
    sayHelloBtn.setName("say-hello-btn");

    // Libellé pour afficher le "bonjour"
    JLabel helloLabel = new JLabel();
    helloLabel.setName("hello-label");

    // Action lors d'un clic sur le bouton
    sayHelloBtn.addActionListener(event -> {
      // Libellé avec le message "Bonjour"
      helloLabel.setText("Bonjour " + nameTextField.getText() + " !");
    });

    // Élément racine
    JPanel root = new JPanel(new FlowLayout(FlowLayout.LEFT));

    // Ajoute les composants
    root.add(nameTextField);
    root.add(sayHelloBtn);
    root.add(helloLabel);

    // La fenêtre
    JFrame frame = new JFrame();
    frame.add(root);
    frame.setTitle("App");
    frame.setSize(600, 75);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

  }

}

Le test AssertJ

import static org.assertj.swing.finder.WindowFinder.findFrame;
import static org.assertj.swing.launcher.ApplicationLauncher.application;

import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.util.stream.IntStream;

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

import org.assertj.swing.core.BasicRobot;
import org.assertj.swing.core.ComponentFinder;
import org.assertj.swing.core.GenericTypeMatcher;
import org.assertj.swing.core.Robot;
import org.assertj.swing.fixture.JLabelFixture;
import org.junit.jupiter.api.Test;

class AppTestSwing {

  @Test
  void should_display_bonjour_with_name() {

    // Démarre l'application
    application(App.class).start();

    // Création du robot
    Robot robot = BasicRobot.robotWithCurrentAwtHierarchy();

    // Trouve la fenêtre et vérification de son titre et de sa visibilité
    findFrame(new GenericTypeMatcher < Frame > (Frame.class) {
      protected boolean isMatching(Frame frame) {
        return "App".equals(frame.getTitle()) && frame.isShowing();
      }
    }).using(robot);

    // Pour trouver les composants
    ComponentFinder finder = robot.finder();

    // Les composants
    JTextField nameTextField = (JTextField) finder.findByName("firstname-textfield");
    JButton sayHelloBtn = (JButton) finder.findByName("say-hello-btn");
    JLabel helloLabel = (JLabel) finder.findByName("hello-label");

    // Pour tester la valeur du libellé
    JLabelFixture labelFixture = new JLabelFixture(robot, helloLabel);

    robot.click(nameTextField);
    robot.enterText("Pierre");
    robot.click(sayHelloBtn);
    labelFixture.requireText("Bonjour Pierre !");
    robot.click(nameTextField);
    // Efface le texte dans le champ (en appuyant sur retour arrière)
    robot.pressAndReleaseKeys(IntStream.generate(() -> KeyEvent.VK_BACK_SPACE).limit("Pierre".length()).toArray());

    robot.click(nameTextField);
    robot.enterText("Paul");
    robot.click(sayHelloBtn);
    labelFixture.requireText("Bonjour Paul !");
    robot.click(nameTextField);
    robot.pressAndReleaseKeys(IntStream.generate(() -> KeyEvent.VK_BACK_SPACE).limit("Paul".length()).toArray());

    robot.click(nameTextField);
    robot.enterText("Jacques");
    robot.click(sayHelloBtn);
    labelFixture.requireText("Bonjour Jacques !");

  }

}

Commentaires