重複の可能性:
FEST がアプリケーションのロードを待機するようにする
注: この質問は基本的にこの質問と同じです。その質問に対する答えがなかったので、私はそこから例を実行可能な SSCE に拡張し、いくつかの追加情報を提供することにしました。
したがって、問題は、探しているコンポーネントがまだ存在しない可能性がある場合に、コンポーネントのルックアップをどのように処理すべきかということです。この単純な 1 つのラベルの GUI を見てください。
public class MyFrame extends JFrame {
JLabel theLabel;
public MyFrame() {
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
theLabel = new JLabel();
theLabel.setName("theLabelName");
computeLabelContentOnWorkerThread();
}
private void computeLabelContentOnWorkerThread() {
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
Thread.sleep(5000);
return "Info from slow database connection";
}
@Override
protected void done() {
try {
theLabel.setText(get());
add(theLabel);
pack();
setVisible(true);
} catch (InterruptedException ignore) {
} catch (ExecutionException ignore) {
}
}
}.execute();
}
}
そして、このテストケース:
public class TestOfDelayedComponent extends FestSwingJUnitTestCase {
FrameFixture frameWrapper;
@Before
public void onSetUp() {
MyFrame frame = GuiActionRunner.execute(new GuiQuery<MyFrame>() {
protected MyFrame executeInEDT() {
return new MyFrame();
}
});
frameWrapper = new FrameFixture(robot(), frame);
frameWrapper.show();
}
@Test
public void testLabelContent() {
String labelContent = frameWrapper.label("theLabelName").text();
assertTrue(labelContent.equals("Info from slow database connection"));
}
}
何が起こるのですか?ラベル コンポーネントの構築は、遅いワーカー スレッドに委譲されます。そのため、GUI が表示されたときにすぐにラベルが表示されるわけではありません。テスト ケースの実行時にラベルが表示されていないため、 でコンポーネント ルックアップを実行するframeWrapper.label("theLabelName")と、ComponentLookupException がスローされます。
問題は、この例外がスローされないようにするにはどうすればよいかということです。それが最上位のコンポーネントであるWindowFinder.findFrame("title").withTimeout(10000)場合、フレームが表示されるまでに遅延がある場合でも、フレームを見つけることができる FrameFinder オブジェクトを取得することができます。私が欲しいのはそれに似たものですが、JLabelなどの他のタイプのコンポーネント用です。
注: 確かに、この機能を自分で実装するのはそれほど難しくありません。行うのはかなり簡単です:
while(noComponentFound and notReachedTimeout){
look for component using FEST
sleep for a short delay
}
ただし、このようなループでテスト スクリプトをごちゃごちゃにする必要はありません。コンポーネントを待機することは、テスト スクリプトではあまり珍しいタスクではないように感じます。したがって、私の意見では、FEST でこれを行うためのサポートが必要です。多分これはそうではありませんか?コンポーネントを待つことはできませんか?