...
Code Block | ||
---|---|---|
| ||
<HBox xmlns:fx="http://javafx.com/fxml"
fx:controller="javafx.fxmlexamples.Example4Controller">
<TextField fx:id="textField" promptText="Type something here"/>
<Button fx:id="upcaseButton" text="Click me!" onAction="#handleUpcaseAction"/>
</HBox>
|
...
Testing med TestFX
Når en bruker TestFX, må testklassen arve fra GuiTest (i pakken org.loadui.textfx). Dette (tror jeg) sikrer riktig trådhåndtering og oppstart av JavaFX. I motsetning til ved vanlig JUnit-tester, så bruker en ikke noen setUp-metode (JUnit 3) eller @Before-annotert metode (JUnit 4). Istedet redefineres Parent getRootNode()-metoden slik at den rigger opp (den delen av) GUI-et som skal testes og returnerer (en referanse til) rot-noden. Merk at denne ikke skal være lagt inn i noen Scene eller Stage, dette gjør TestFX for oss.
Testene skrives som vanlig (i JUnit 4) i metoder annotert med @Test. Disse kjøres selvsagt etter at getRootNode() er kalt, slik at GUI-et er ferdig rigget av TestFX. I testmetodene brukes egne metoder for 1) å få tak i spesifikk elementer i GUI-hierarkiet og 2) simulere bruker-interaksjon. F.eks. så brukes clickOn(...) til å klikke på knapper og i tekstfelt (for å gi det fokus) og type(...) for å taste inn tekst. Disse metodene er såkalt "fluent", så de kan kjedes sammen. Her er testkoden for eksemplet vårt:
Code Block | ||||
---|---|---|---|---|
| ||||
public class Example5Test extends GuiTest { @Override protected Parent getRootNode() { try { return FXMLLoader.load(this.getClass().getResource("Example5Test.fxml")); } catch (IOException e) { System.err.println(e); } return null; } @Test public void testHandleProcess() { TextField textField = find("#textField"); String text = "Example5 test"; clickOn(textField).type(text); clickOn("#upcaseButton"); assertEquals(text.toUpperCase(), textField.getText()); } } |
...