1

所以这是我的项目:

我正在构建一个中央界面/仪表板来呈现多个产品版本的几种测试类型的测试数据。我们在我们的大型产品上使用 TestNG,虽然没有编写足够的测试,但这是另一个话题的讨论。目录结构如下所示:

文件系统/productVersion+testType/uniqueDateAndBuildID/testng-results.xml

该 results.xml 文件包含带有子测试标签的标签,这些标签对应于文件系统目录,然后是包含实际测试用例结果(通过、失败等)的 xml 文件。XML 解析和文件系统遍历都很好,很好/可靠。

控制流程:客户端访问主页--> 服务器打开属性文件--> 服务器检查Web 服务器属性(Websphere 或Tomcat,如果我在本地工作)--> 服务器根据它设置一堆常量。常量包括:根文件系统目录、文件系统分隔符(翻译)、“类似类型(在不同平台上基本相同的测试)”以及要附加到的基本 URL。--> 服务器然后再读取一些属性文件并进行所有的 XML 处理。结果缓存在内存中以及使用 ObjectOutputStream 的文件系统中。--> 一个大的结果列表被发送回客户端进行 UI 处理/显示。

这是我遇到问题的地方:即使它们位于共享文件夹中,我也无法在客户端上访问那些全局变量(包含/设置在 Globals 类中......我知道不好 :-/ )。如果您想知道为什么我不能再次加载属性,那是因为客户端是 GWT 化的 Javascript,它不包含 File()。所以我的下一个想法是,在阅读了一些上层 Java 之后,也许可以使用一个 Globals 单例对象并将其也传回......但这似乎同样糟糕,如果不是不可能的话。 这里的建议会很棒。

整个事情是非常紧密耦合的,我之前的 Java 教育还没有真正进入。而且由于这只是供开发人员检查的内部门户,因此实际测试我的代码似乎没有多大意义。只要它正确显示、正确记录并优雅地处理错误,对吗?总而言之,它的课程少于 15 节,所以我猜这并不是什么大不了的事。我应该重构以清理所有内容并使其“更好的Java”,注释所有内容以清楚地描述控制流,还是因为它很小而不必太担心它?我知道将来在设计它们之前要多考虑一些事情,但是我真的不知道从开始接触到的大量高级 Java 原理。

经过一番思考后进行编辑,想出了一个可能的解决方法。怎么样,不是传回一个结果列表,而是传回一些其他自定义列表实现,其中包括一个全局“标题”对象?我可以保存状态。

4

3 回答 3

5

一个简单的解决方案是Dictionary类:

提供在模块的宿主 HTML 页面中定义的键/值字符串对的动态字符串查找。Dictionary 的每个唯一实例都绑定到一个命名的 JavaScript 对象,该对象位于宿主页面的窗口对象的全局命名空间中。绑定的 JavaScript 对象直接用作关联数组。

您只需向主机 HTML 页面添加一些动态内容 - 让服务器以 JavaScript 对象的形式打印从属性文件中读取的值:

var GlobalProperties = {
  property1: "value1",
  property2: "value2"
};

然后,在代码中使用 Dictionary 来读取这些值:

Dictionary globalProperties = Dictionary.getDictionary("GlobalProperties");
String property1 = globalProperties.get("property1");

PS:如果您正在寻找关于如何使您的代码更少耦合-> 更可测试的好主意/建议,我会推荐Misko Hevery 的博客。他有很多有趣的帖子,比如为什么单例通常不好(全局状态,而不是模式本身)。但最重要的是 - 它有编写可测试代码的很棒的指南(谷歌内部使用的一些指南)。

于 2010-08-25T23:58:12.097 回答
1

您可以使用带有 HashMap 的简单对象(即 GWT-RPC 调用)传递这些全局变量,或者仅将这个 Hashmap 包含在您已经检索到的结果中(沿着“发送回客户端进行 UI 处理/显示。”)

于 2010-08-24T22:25:01.270 回答
1

您无法从已编译的 javascript 访问服务器端单例。

你基本上有两个选择。您可以Serializable在客户端代码中创建一个表示全局变量的类,或者传递您的全局变量对象,但这是一种效率相当低的解决方案。

最简单的方法是HashMap<String, String>在可序列化对象中使用 a,您可以通过 RPC 调用来检索它:

public class GwtGlobalVariables implements Serializable {
    private HashMap<String, String> map = new HashMap<String, String>();

    public void put(// a  delegate put method of choice

    public void setMap() // a getter / setter for the map if you need it
}

确保该类位于 GWT 模块的源文件夹中,即可能与您的入口点位于同一位置。

用所需的值填写地图,通过 rpc 将其传递给您的客户端代码。

于 2010-08-25T14:56:34.523 回答