JUnit Test von JButton: Action wird nicht erkannt

14/07/2016 - 01:09 von Christian H. Kuhn | Report spam
Hallo Gemeinde,

Ich verzweifle gerade.

Vollstàndiger Code auf https://www.qno.de/gitweb/, Branch v0.8.4. Die
wichtigsten Ausschnitte:

public class QChessClockJavaAV extends JFrame implements
QChessClockObserver, ActionListener {

(...)

private final transient JButton resetButton;

(...)

public QChessClockJavaAV(final QChessClock _clock) {
super("QChessClock – The JAVA Chess Clock from your FIDE Arbiter");
final JPanel contentPanel = new JPanel();
contentPanel.setLayout(new GridBagLayout());
final GridBagConstraints constraint = new GridBagConstraints();
constraint.fill = GridBagConstraints.BOTH;
constraint.weightx = 1;
(...)
resetButton = new JButton("R");
resetButton.setActionCommand("reset");
resetButton.addActionListener(this);
resetButton.setMinimumSize(QChessClockJavaAV.BUTTON_DIMENSION);
resetButton.setName("ResetButton");
constraint.gridx = 1;
constraint.gridy = 1;
contentPanel.add(resetButton, constraint);
}

(...)

public final void actionPerformed(final ActionEvent _event) {
final String myActionCommand = _event.getActionCommand();

switch (myActionCommand) {
case "reset":
clock.resetPressed();
break;
(...)
default:
}
}
(...)
}

public class QChessClockJavaAVTest implements QChessClockObserver {

private transient QChessClockJavaAV sut;
private transient QChessClock clock;
private transient JButton resetButton;
private transient QChessClockState status;

@Before
public final void setUp() throws Exception {
clock = new QChessClock();
clock.addObserver(this);
sut = new QChessClockJavaAV(clock);
resetButton = (JButton) TestUtils.getChildNamed(sut, "ResetButton");
}

public final void update(final QChessClockState _state) {
status = _state;
}

@Test
public final void pressResetButtonTest() throws Throwable {
leftButton.doClick();
stopButton.doClick();
Thread.sleep(TWO_CYCLES);
resetButton.doClick();
Thread.sleep(TWO_CYCLES);
assertSame(QChessClockState.NOT_STARTED, status);
}
}

TestUtils von
http://www.javaworld.com/article/20...tions.html

Der Test fails. status ist STOPPED, was es nach stopButton.doClick sein
sollte, aber nicht mehr nach resetButton.doClick.

resetButton wurde korrekt aufgefunden, wie durch einen Test mit
setBackground(Color) herausgefunden wurde.

Wird QChessClockJavaAV normal gestartet und mit der Maus bedient,
funktioniert der Button wie geplant.

Alle anderen Knöpfe reagieren wie gewollt auf doClick().

resetButton.doClick() löst keine Aktion aus, oder zumindest wird sie
nicht von actionPerformed() in QChessClockJavaAV aufgefangen. Ein
Breakpoint zu Beginn von actionPerformed() hàlt im Debugger bei allen
anderen Knöpfen an, wird aber bei resetButton.onClick() nicht getroffen.
Stattdessen wird die nàchste Zeile im Test, Thread.sleep(), ausgeführt.

Ich habe auch versucht, den Knopf mit doClick(1000) lànger zu drücken.
Gleicher Fehler.

Mir fehlen die Ideen, wo ich noch suchen soll. Alle mir vorstellbaren
Fehlermöglichkeiten sind ausgeschlossen. Und am Ende ist es dann wie
üblich irgendwas ganz primitives ...

TIA
QNo
 

Lesen sie die antworten

#1 Christian H. Kuhn
14/07/2016 - 18:26 | Warnen spam
Am 14.07.2016 um 01:09 schrieb Christian „Ingrid“ Kuhn:

Die Tests waren natürlich extrem umstàndlich. Also aus QChessClock ein
Interface extrahiert. Die Testklasse implementiert jetet dieses
Interface und schleicht sich als Mock-Uhr in die zu testende GUI ein.
Damit können die Methodenaufrufe wesentlich leichter getestet werden.
Der Reset-Button reagiert allerding immer noch nicht.

Weiteres Herumspielen mit Farbmarkierungen funktionierte bei diesem
Knopf auch nicht. Allerdings kam dadurch der entscheidende Hinweis: Der
Button war schlicht und ergreifend nicht aktiviert. Nach
setEnabled(true) ist dann alles gelaufen.

lg
QNo

Ähnliche fragen