在使用 Swing 开发 Java 桌面应用程序时,我遇到了直接测试 UI 的需要,而不仅仅是通过单元测试测试底层控制器/模型类。
这个答案(关于“基于 Swing 的应用程序的最佳测试工具是什么?”)建议使用FEST,不幸的是,它已停止使用。然而,有一些项目是从 FEST 离开的地方继续进行的。特别是一个(在这个答案中提到)引起了我的注意,因为我之前在单元测试中使用过它:AssertJ。
显然有AssertJ Swing,它基于 FEST 并提供了一些编写 Swing UI 测试的易于使用的方法。但是,进行初始/工作设置仍然很麻烦,因为很难说从哪里开始。
如何为以下示例 UI 创建最小的测试设置(仅包含两个类)?
约束:Java SE、Swing UI、Maven 项目、JUnit
public class MainApp {
/**
* Run me, to use the app yourself.
*
* @param args ignored
*/
public static void main(String[] args) {
MainApp.showWindow().setSize(600, 600);
}
/**
* Internal standard method to initialize the view, returning the main JFrame (also to be …Run Code Online (Sandbox Code Playgroud) 有没有办法即时创建 React 组件(或者更具体地说:上下文菜单),即仅当用户请求这样的上下文菜单时?
构建单个上下文菜单所需的所有信息都已经存在于触发它的组件上,这意味着无需等待任何异步获取数据。
在其他情况下,这可以很容易地实现,但我无法理解在 React+Redux 应用程序中应该如何做到这一点。
在编写本文时唯一想到的是在触发上下文菜单时发送一个动作,并将这个单个上下文菜单作为某种弹出对话框包含在结果重新渲染中。
这至少可以避免不可见组件的过早创建。但不知何故,它感觉像是一种反模式。我在这里缺少什么?
在我的 React 应用程序中显示的状态是一个分层结构,实际上嵌套了六到七层深。
在顶层,它是一个简单的列表。但是每个列表项都有这样的结构:
Item = {
priorChildren: List<Item>
content: List<NonHierarchicalData>
laterChildren: List<Item>
}
Run Code Online (Sandbox Code Playgroud)
这些Items 可以以用户认为合适的任何方式嵌套。
Item应该通过上下文菜单提供最多五个操作,具体取决于其在层次结构中的位置(可能不超过 10 个排列)。NonHierarchicalData还应根据其数据提供一个上下文菜单,最多可能有 30 个菜单项。由于数据包含合并到菜单项中的用户输入,因此每个上下文菜单都可能是唯一的。一个现实状态可能包含大约 30 或 40 个这样的Items,每个都有 5 到 10 个NonHierarchicalData元素。根据这些数字,我最终可以得到 ca。250 个不同的上下文菜单,包含 5000 多个菜单项。在任何给定的时间,用户可能只会在选择一个动作之前打开一个或两个上下文菜单,从而触发状态更改,从而触发重新渲染。
一方面,有一些很棒的现有库,例如react-contextmenu,它们期望所有上下文菜单变体都是预先知道的,并且作为 DOM 的一部分创建,仅在需要时才可见。
另一方面,创建数百个包含数千个条目的菜单只是为了显示其中的几十个,然后在下一次状态更改后不可避免地重新创建它们,这感觉违反直觉。
我无法使用单例设计模式创建对象,这是我做的:
class Test {
public static Test objTest = null;
public static int count = 0;
public static Test CreateObject() {
if (objTest != null)
objTest = new Test();
return objTest;
}
private Test() {
Test.count++;
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了zeroton模式吗?
java ×2
assertj ×1
contextmenu ×1
javascript ×1
react-redux ×1
reactjs ×1
singleton ×1
swing ×1
ui-testing ×1