(4)创建ModifyActionListener类,该类是“修改”按钮的事件监听器,它必须实现ActionListener接口,并在actionPerformed()方法中获取所有文本框内容,其中包括修改后的信息,并通过调用updateGys()方法将这些供应商信息更新到数据库中。关键代码如下:
例程20 代码位置:光盘\TM\01\JXCManager\src\internalFrame\gysGuanLi\GysXiuGaiPanel.java
class ModifyActionListener implements ActionListener { //“修改”按钮的事件监听器
public void actionPerformed(ActionEvent e) {
Item item = (Item) gys.getSelectedItem();
TbGysinfo gysInfo = new TbGysinfo(); //创建供应商实体对象
gysInfo.setId(item.getId()); //初始化供应商实体对象
gysInfo.setAddress(diZhiF.getText().trim());
gysInfo.setBianma(bianMaF.getText().trim());
gysInfo.setFax(chuanZhenF.getText().trim());
gysInfo.setYh(yinHangF.getText().trim());
gysInfo.setJc(jianChengF.getText().trim());
gysInfo.setName(quanChengF.getText().trim());
gysInfo.setLian(lianXiRenF.getText().trim());
gysInfo.setLtel(lianXiRenDianHuaF.getText().trim());
gysInfo.setMail(EMailF.getText().trim());
gysInfo.setTel(dianHuaF.getText().trim());
if (Dao.updateGys(gysInfo) == 1) //更新供应商信息
JOptionPane.showMessageDialog(GysXiuGaiPanel.this, "修改完成");
else
JOptionPane.showMessageDialog(GysXiuGaiPanel.this, "修改失败");
}
}
(5)创建DelActionListener类,该类是“删除”按钮的事件监听器,它必须实现ActionListener接口,并在actionPerformed()方法中获取当前选择的供应商,然后调用Dao类的delete()方法从数据库中把该供应商删除。关键代码如下:
例程21 代码位置:光盘\TM\01\JXCManager\src\internalFrame\gysGuanLi\GysXiuGaiPanel.java
class DelActionListener implements ActionListener { //“删除”按钮的事件监听器
public void actionPerformed(ActionEvent e) {
Item item = (Item) gys.getSelectedItem(); //获取当前选择的供应商
if (item == null || !(item instanceof Item))
return;
int confirm = JOptionPane.showConfirmDialog( //弹出确认删除对话框
GysXiuGaiPanel.this, "确认删除供应商信息吗?");
if (confirm == JOptionPane.YES_OPTION) { //如果确认删除
int rs = Dao.delete("delete tb_gysInfo where id='" //调用delete()方法
+ item.getId() + "'");
if (rs > 0) {
JOptionPane.showMessageDialog(GysXiuGaiPanel.this, //显示删除成功对话框
"供应商:" + item.getName() + "。删除成功");
gys.removeItem(item);
} else {
JOptionPane.showMessageDialog(GysXiuGaiPanel.this,
"无法删除客户:" + item.getName() + "。");
}
}
}
}
1.7.5 单元测试
在现代软件开发过程中,单元测试成为与编写代码同步进行的开发活动。单元测试能够提高程序员对程序的信心,保证程序的质量,加快软件开发速度,使程序易于维护。
1.单元测试概述
单元测试是在软件开发过程中要进行的最低级别的测试活动。在单元测试活动中,软件的独立工作单元将在与程序的其他部分相隔离的情况下进行测试。
在传统的结构化编程语言中,如Java语言,要进行测试的工作单元一般是方法。在像C++这样的面向对象的语言中,要进行测试的基本单元是类。单元测试不仅仅是作为无错编码的一种辅助手段在一次性的开发过程中使用,还必须是可重复的,无论是在软件修改或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行。
2.什么是单元测试
它是一种验证行为
程序中的每一项功能都可以通过单元测试来验证其正确性,为以后的开发提供支持。就算是开发后期,也可以轻松地增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且,它为代码的重构提供了保障。这样,我们就可以更自由地对程序进行改进。
它是一种设计行为
编写单元测试将使我们从调用者的角度观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。
它是一种编写文档的行为
单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,它永远保持与代码同步。
3.越到项目后期,单元测试为何越难进行
在很多项目的初期,项目中的大部分程序员都能够自觉地编写单元测试。但随着项目的进展、任务的加重,离交付时间越来越近,不能按时完成项目的风险越来越大,单元测试就往往成为牺牲品了。项目经理因为进度的压力也不重视了,程序员也因为编码的压力和无人看管而不再为代码编写单元测试了。笔者亲身经历的项目都或多或少地发生过类似这样的事情。越是在项目的后期,能够坚持编写单元测试的程序员在整个项目组中所占比例越来越低。
为了追赶项目进度,多数程序员将没有经过任何测试的程序代码上传到版本控制系统,项目经理也不再追问,照单全收。这样做的结果就是在项目后期,技术骨干人员只好加班加点进行系统集成。集成完成之后,下发给测试人员测试时,Bug的报告数量翻倍增长。程序员开始修改Bug,但有非常多的Bug隐藏得很深,一直潜伏到生产环境中去。
4.JUnit单元测试工具的介绍与使用
JUnit使用介绍
JUnit是一个单元测试框架,专门用于测试Java开发的程序。同类产品还包括Nunit(.NET)、CPPUnit(C++),都属于xUnit中的成员。目前JUnit的最新版本是JUnit 4.0,在Eclipse开发工具中已经集成了JUnit的多个版本。
在正式讲解JUnit之前,先来看一下单元测试的运行效果,如图1.23和图1.24所示。
在图1.23和图1.24中很容易发现不同颜色的警示条,图1.23所示是绿色的,图1.24所示是红色的。如果所有测试案例运行成功,就为绿色;反之,如果有一个不成功,则为红色。
? 使用JUnit进行单元测试
下面开始按步骤讲解如何在Eclipse中使用JUnit工具。
(1)为单元测试代码创建一个Java项目,将其命名为JUnitTest。
(2)创建ItemTest类,该类用于测试公共类Item的行为(即方法)。在“创建Java类”对话框中设置该类的超类为TestCase,也就是继承JUnit框架的测试用例编写单元测试,单击“完成”按钮,如图1.25所示。
(3)在项目的构建路径中添加JUnit类库。右击项目名称,在弹出的快捷菜单中选择“构建路径”/“添加库”命令,在弹出的“添加库”对话框中选择Junit选项,单击“下一步”按钮,如图1.26所示。