有关如何设置JFCUnit,请参考我前面的文章:JFCUnit测试GUI的一个实例(配置篇)
http://blog.csdn.net/EagleWatch/archive/2005/08/24/464541.aspx
下面给出被测试代码,因为只是普通的样例,所以不加以太多的说明。这段GUI代码的编写使用了Eclipse的GUI创建插件——Visual Editor,如果你有兴趣可以去相关的网站看看,有关这方面的介绍还是很多的。
因为时参考一部分资料,加上自己摸索做的DEMO,如果有什么问题和建议欢迎和我联系(DanielWJiang@Gmail.com)我会在第一时间更新这篇文章。
下面的应用程序的主要功能是,当用户在JTestField中输入数据,显示控件会同步显示输入的信息,点击OK按钮退出程序。
JFCUnit没有直接在Eclipse内建的项目中给出可视化的创建JFCUnit Test Case的方法(也许是我我没有了解到)。这里采用的方法是利用Eclipse内提供的JUnit Test Case创建向导产生一个JUnitTestCase的派生类,然后改变extend后面的类名称为JFCTestCase。因为JFCUnit是JUnit的一个延伸,所以你这样做不会有任何问题。
这便有必要提一下的是,JUnit对于我们的用户界面,除了它默认的原始类构造函数,main(),构造函数setUp()和析构函数tearDown()以外,不会创建任何测试函数,这一点和JUnit一般的测试不同,所以我们必须手动创建一些测试函数。
手动创建的函数必须满足:
§ 它是一个public final的函数
§ 而且必须以test冠以函数名
要演示的例子当中可以看到的手动添加的函数有两个,一个是testDialog(),另一个是testAllComponentsInit()。先看testDialog()这个函数:
public final void testDialog() {
JDialog dialog;
java.util.List showingWindows;
NamedComponentFinder finder = new NamedComponentFinder(
JComponent.class, "OKButton");
JButton okButton = (JButton) finder.find(demo, 0);
assertNotNull("Could not find the OK button", okButton);
DialogFinder dFinder = new DialogFinder(demo.getTitle());
showingWindows = dFinder.findAll();
dialog = (JDialog) showingWindows.get(0);
finder.setName("InputField");
inputText = (JTextField) finder.find(demo, 0);
assertNotNull("Could not find JTextField", inputText);
finder.setName("DisplayField");
displayText1 = (JTextField) finder.find(demo, 0);
assertNotNull("Could not find JTextField", displayText1);
XMLParser xmlFile;
int len;
try {
xmlFile = new XMLParser();
xmlFile.setURI(".\\config.xml");
len = xmlFile.getTestDataListLength();
ctrlName = xmlFile.getCtrlNames();
ctrlValue = xmlFile.getCtrlValues();
String content = HtmlMaker.HtmlFileHeader();
for (int i = 0; i < len; i++) {
try {
index = i;
// Make the text field get the focus
pauseAWT();
inputText.setText(ctrlValue[i]);
inputText.requestFocus();
assertEquals("Set focus failed.", inputText.getText(),
ctrlValue[i]);
JFCTestHelper.disposeWindow(dialog, this);
okButton.requestFocus();
flushAWT();
// Gernate the report of the test
content = HtmlMaker.HtmlFileContentsFill(content, inputText
.getName(), inputText.getText());
content = HtmlMaker.HtmlFileContentsFill(content, displayText1
.getName(), displayText1.getText());
// Simulate click the OK button.
pauseAWT();
getHelper().enterClickAndLeave(
new MouseEventData(this, okButton));
flushAWT();
} catch (Exception ex) {
ex.printStackTrace();
}
}
content = HtmlMaker.HtmlFileEnd(content);
HtmlMaker html = new HtmlMaker(content);
} catch (Exception ex) {
ex.printStackTrace();
}
}
§ NamedComponentFinder finder = new NamedComponentFinder(JComponent.class, "OKButton");
NamedComponentFinder是JFCUnit提供的类,用来寻找当前窗体中的控件类实例。这边调用了带参构造函数找寻OK按钮。
§ JButton okButton = (JButton) finder.find(demo, 0);
利用找到的结果来获得OK按钮的控制。
§ assertNotNull("Could not find the OK button", okButton);
为了使下面的测试有意义,所以有必要判断是否为非空的,否则判定当前的TestCase没有成功。
§ DialogFinder dFinder = new DialogFinder(demo.getTitle());
showingWindows = dFinder.findAll();
dialog = (JDialog) showingWindows.get(0);
是可以用上面讲到的内容举一反三了解它的功能是获取窗体实例。
§ inputText.requestFocus();
使输入对话框获取焦点。
§ getHelper().enterClickAndLeave(new MouseEventData(this, okButton));
模拟鼠标点击事件。
§ pauseAWT();
用来停止awt的事件队列,根据文档上的说明,使用pauseAWT()会在调用releaseAWT()以后后恢复队列的运行。但是我尝试调用这个releaseAWT()函数,Eclipse告诉我没有这样的函数定义。在文档中搜索着个函数的定义没有发现。这里我用了flushAWT()来达到启动队列的效果。
§ flushAWT();
上面我们提到了是启动消息队列。