对 Swing 组件进行单元测试

2022-09-03 12:19:01

我正在编写一个类似 TotalCommander 的应用程序。我有一个单独的文件列表组件,以及它的模型。模型支持侦听器,并按以下方式为事件等发出通知: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


答案 1

请注意,一般来说,对UI的东西进行单元测试总是很困难的,因为你必须模拟出很多不可用的东西。
因此,开发应用程序(任何类型的)的主要目的始终是尝试尽可能地将UI内容与主应用程序逻辑分开。在这里拥有强大的依赖性,使单元测试变得非常困难,基本上是一场噩梦。这通常是通过使用像MVC这样的模式来利用的,在这种方法中,你主要测试你的控制器类,你的视图类除了构造UI并将其操作和事件委托给控制器之外什么都不做。这分散了责任,使测试更容易。

此外,您不一定要测试框架已经提供的内容,例如测试事件是否正确触发。你应该测试你自己写的逻辑。


答案 2

这个

FEST是一个库的集合,在Apache 2.0许可证下发布,其使命是简化软件测试。它由各种模块组成,可以与TestNGJUnit一起使用。


推荐