1

我正在研究 JavaFX 中的用户界面。它是我已经开发并运行的基础设施服务的前端。我在这里和那里读到,mock 可用于避免在运行繁重时运行所有系统,但也可用于隔离目的。

目前我想运行一些基本测试,因为我也在学习如何使用 JavaFX,我不想为此运行我所有的基础设施。

基本上我有一个TreeView我想根据来自服务的内容进行更新。通常在后台运行的服务会更新模型并调用一个Platform.runlater()方法来要求 UI 刷新。

我想知道如何使用模拟来实现这一点。如何让模拟对象更新简化的共享结构,例如列表(模型),然后调用Platform.runlater()?实际上,我首先要问:mock 是否可行且合适,如果可以,如何使用,使用哪个框架?

我个人不太清楚的是多线程的参与。事实上,我的被测对象(即接口)不会调用我的模拟的任何方法,间接地期望该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 回答