1

私はJavaFXのユーザーインターフェースに取り組んでいます。すでに開発・運用しているインフラサービスのフロントエンドです。私はあちこちで、実行するのが重いときにすべてのシステムを実行するのを避けるためにモックを使用できることを読みましたが、分離の目的でも使用できます。

現在、JavaFX の使用方法も学習しているため、いくつかの基本的なテストを実行したいと考えており、そのためにすべてのインフラストラクチャを実行したくありません。

基本的にTreeView、サービスからの情報に基づいて更新したい があります。通常、バックグラウンドで実行されるサービスはモデルを更新し、Platform.runlater()メソッドを呼び出して UI に更新を要求します。

モッキングを使用してそれをどのように達成できるか疑問に思っていました。モック オブジェクトで list(model) などの単純化された共有構造を更新してから呼び出すにはどうすればよいPlatform.runlater()ですか? 実際、私は最初に質問します: それは可能で適切なモックの使用法ですか? はいの場合、どのフレームワークでどのように行うことができますか?

個人的には、マルチスレッドの関与が少しわかりません。Run()実際、インターフェースであるテスト対象の私のオブジェクトは、私のサービスが実行可能であることを考えると、間接的にメソッドを期待して、私のモックのメソッドを呼び出すことはありません。

したがって、誰かがこの問題についてもう少し教えていただければ幸いです。よくわかりません....

一番、

マータリ

4

1 に答える 1

0

まず、TreeView に特定のデータを入力できるアプリケーションを準備します (または現在のアプリをテスト モードをサポートするように変更します)。TreeView に偽のデータを提供するエンティティは、特定のデータのモックオブジェクトになります。TreeView の観点からはサービスのように見えるはずです。つまり、サービス クラスから共通のメソッドをインターフェイスに抽出し、TreeView が具体的なクラスの代わりにこのインターフェイスを使用するようにする必要があります。

UI テストを処理するには、JemmyFXライブラリを使用できます。TestView の UI プロパティを検証したり、マウス クリックやテキスト入力などのユーザー アクションを模倣したりする簡単なテストを作成できます。スレッドの問題について心配する必要はありません。jemmy が処理してくれます。

次のようになります (ここではテスト ハーネスとして junit を使用します)。

public class TreeTest {

    @BeforeClass
    public static void setUpClass() throws Exception {
        // running your specially crafted FX application with mock service data
        // you can do it any way, e.g. by calling main() method with some parameters
        AppExecutor.executeNoBlock(TreeApp.class);
    }

   @Test // this is junit annotation for test
   public void fooTest() {
        // here we are receiving special jemmyfx entity which knows how to handle 
        // tree views and is attached to your TreeView
        // (if you app has only one TreeView, you may need additional logic for several ones)
        TreeViewDock tree = new TreeViewDock(new SceneDock().asParent());
        // this way we can find some item which you expected to see in you TreeView 
        // because you've created you mock data this way.
        // Note that underlying code will respect UI threading, 
        // will understand that UI can have delay and will give it certain time without blocking
        // and will throw descriptive exception in case expected item wasn't found
        tree.asTree().selector().select(new ByToStringLookup("item1"));

        // you can find subitems
        tree.asTree().selector().select(new ByToStringLookup("item1"), new ByToStringLookup("subitem1");
        // and perform operations on them, e.g. expand:
        new TreeItemDock(tree.asItemParent(), new EqualsLookup("item2")).asTreeItem().expand();
        //etc
    }

コード補完のヒントだけでサイトの詳細情報を見つけることができます

于 2013-11-30T10:58:43.033 に答える