Swing 组件的单元测试

2024-01-15

我正在编写一个类似 Total Commander 的应用程序。我有一个单独的文件列表组件及其模型。模型支持侦听器并发出事件通知,例如CurrentDirChanged等方式如下:



private void fireCurrentDirectoryChanged(final IFile dir) {
    if (SwingUtilities.isEventDispatchThread())
        for (FileTableEventsListener listener : tableListeners)
            listener.currentDirectoryChanged(dir);
    else {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                for (FileTableEventsListener listener : tableListeners)
                    listener.currentDirectoryChanged(dir);
            }
        });
    }
}
  

我为此编写了一个简单的测试:



@Test
public void testEvents() throws IOException {
    IFile testDir = mockDirectoryStructure();
    final FileSystemEventsListener listener = 
                context.mock(FileSystemEventsListener.class);
    context.checking(new Expectations() {{
        oneOf(listener).currentDirectoryChanged(with(any(IFile.class)));
    }});

    FileTableModel model = new FileTableModel(testDir);
    model.switchToInnerDirectory(1);
}
  

这不起作用,因为没有EventDispatchThread。有什么方法可以在无头构建中对此进行单元测试吗?

java swing jmock 单元测试


请注意,一般来说,对 UI 内容进行单元测试总是很困难,因为您必须模拟很多不可用的内容。
因此,开发(任何类型)应用程序时的主要目标始终是尝试尽可能地将 UI 内容与主应用程序逻辑分开。这里有很强的依赖性,使单元测试变得非常困难,基本上是一场噩梦。这通常是通过使用像这样的模式来利用的MVC http://blog.js-development.com/2008/03/logical-separation-with-mvc.html一种方法,您主要测试控制器类,而视图类除了构造 UI 并将其操作和事件委托给控制器外什么都不做。这分离了职责并使测试更容易。

此外,您不必测试框架已经提供的东西,例如测试事件是否正确触发。您应该自己测试您编写的逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swing 组件的单元测试 的相关文章

随机推荐

  • Java 中的模块化:顶级类与嵌套类

    我读过的Java教程 喜欢使用嵌套类来演示一个概念 一个特性或用途 这导致我最初实现了一个我创建的示例项目 主活动类中有很多嵌套类 它可以工作 但现在我得到了一个巨大的整体 java 文件 我发现这有点不方便 我现在打算分解为多个 java
  • 如何查明哪些inotify 手表已注册?

    我将 inotify 监视限制设置为 1024 我认为默认值是 128 尽管如此 yeoman Guard 和 Dropbox 不断失败 并告诉我提高 inotify 限制 在此之前 我想知道是什么消耗了我所有的手表 我的 Dropbox
  • 如何使用带模板的结构和类

    使用此代码 只是一类测试 typedef unsigned short UInt16 template
  • 获取 Java 中自纪元以来的天数、周数和月数

    我正在尝试获取自 Java 纪元以来的天数 周数 月数 Java Calendar 类提供了诸如calendar get Gregorian Calendar DAY OF YEAR 或Calendar get Gregorian Cale
  • 在 iPhone 应用程序中记录调试信息的最佳方法是什么?

    是否有某种标准方法或有人写过一些东西 允许您记录消息并将其显示在 iPhone 屏幕上的小滚动部分或 iPhone 模拟器中的单独窗口中 更新 对于像我这样不知道的菜鸟 请使用如下所述的 NSLog 方法 并确保选择 Run gt Cons
  • Unicorn 不关闭数据库连接

    我正在使用 Rails 3 2 unicorn postgres DB 我有一个问题 unicorn 如何处理数据库连接 我的理解是 unicorn主进程分叉X子进程 每个子进程建立数据库连接 在before fork中关闭 在after
  • uitableview + 导航控制器从所选元素设置标题

    我有一个UINnavigationController处理导航UITableView 当我从表中选择一行时 我需要显示在UINavigationController为上一个菜单中选定的项目添加标题 细胞的标签是从外部读取的xml填充的行UI
  • 在搜索表单中 POST 或 GET?

    我创建了一个搜索表单来查找 MVC 网站上的帖子 表单类型应该是 POST 还是 GET 我知道正在获取可以为搜索添加书签等等 使用 GET 有什么缺点吗 谢谢你 米格尔 虽然GET是更传统的数据查询解决方案 在很多情况下GET太有限 无法
  • 刚刚从 IPython 提示符安装后出现“没有名为 sqlalchemy 的模块”

    我无法导入 sqlalchemy 我搜索并发现了一些解决方案 例如安装flask或flask sqlalchemy等 这些都没有帮助 我缺少什么 有时 您需要重新启动ipython让它找到新安装的模块 我相信这适用于添加到的模块sys pa
  • 您的CPU不支持VT-x

    我已经创建了 AVD 但是当我尝试运行 android 程序时 它显示 错误 您的CPU不支持VT x 我在 BIOS 中启用了虚拟化技术 但当我尝试运行 Android 程序时仍然出现此错误 有两种情况 使用VMware 进入 WM gt
  • 部分回发后 jQuery 不工作

    我在外部文件中有下面这个 jquery 函数 因此 在部分回发后 jquery 无法正常工作 我需要在部分回发时从服务器端加载 jquery 有人可以告诉我我需要在这段代码中调用什么以及如何加载jquery jQuery function
  • 获取 Domino 服务器会话超时 - XPage

    如何在 XPages SSJS 中获取 Domino 服务器的会话超时 我想提示用户在会话过期之前保存他 她的数据 谢谢 仅当用户向服务器发出请求时 服务器才与用户通信 因此 如果用户没有请求 服务器就无法向用户发送信息 例如 用户从服务器
  • 如何在 Android 运行时更改当前主题 [重复]

    这个问题在这里已经有答案了 我创建了一个 PreferenceActivity 允许用户选择他想要应用于整个应用程序的主题 当用户选择主题时 将执行以下代码 if getApplication setTheme R style BlackT
  • 如何在 Azure 应用服务中插入具有 1:n 关系的实体

    我需要使用 Azure 应用服务建立 1 n 关系 我按照这个教程 http shellmonger com 2016 05 27 30 days of zumo v2 azure mobile apps day 26 relationsh
  • 使用压缩生成的损坏的 docx

    首先我要说的是 我在这里创建了一个帐户 因为为了尝试解决这个问题 我一直在用头撞墙 所以就这样吧 另外 我已经看到这个问题了here https stackoverflow com questions 13566468 how to com
  • 在 Android 中的自定义视图上添加按钮

    我有以下课程 public class GameActivity extends Activity Override public void onCreate Bundle savedInstanceState super onCreate
  • Android 本机库链接到 aar 中的另一个本机库

    我有一个好奇的问题 我有一个 aar 库 其中包含并使用本机 so 库 现在 我想编写另一个库 它依赖于该库 并且还具有依赖于第一个库中的本机库的本机部分 依赖库同时使用第一个库中的本机代码和 java 包装器 我想知道 有什么办法 如何通
  • JSP编程-response.getWriter().flush();不起作用

    预期结果 浏览器中显示 Hello World 10秒后 幸福再见 被展示 发生了什么 页面加载了 10 秒钟 然后最后显示 Hello World Goodbye Happiness 我想要做的是显示长时间运行的操作在达到不同里程碑时的状
  • 根据使用 applescript 的内容和最佳实践,在终端中选择特定选项卡

    这是一个特定于应用程序的问题 我试图根据其中的内容在 Terminal app 中查找并选择一个选项卡 这是我正在做的事情 tell application Terminal set foundTabs to every tab of ev
  • Swing 组件的单元测试

    我正在编写一个类似 Total Commander 的应用程序 我有一个单独的文件列表组件及其模型 模型支持侦听器并发出事件通知 例如CurrentDirChanged等方式如下 private void fireCurrentDirect