(4)創(chuàng)建ModifyActionListener類,該類是“修改”按鈕的事件監(jiān)聽器,它必須實現(xiàn)ActionListener接口,并在actionPerformed()方法中獲取所有文本框內(nèi)容,其中包括修改后的信息,并通過調(diào)用updateGys()方法將這些供應(yīng)商信息更新到數(shù)據(jù)庫中。關(guān)鍵代碼如下:
例程20 代碼位置:光盤\TM\01\JXCManager\src\internalFrame\gysGuanLi\GysXiuGaiPanel.java
class ModifyActionListener implements ActionListener { //“修改”按鈕的事件監(jiān)聽器
public void actionPerformed(ActionEvent e) {
Item item = (Item) gys.getSelectedItem();
TbGysinfo gysInfo = new TbGysinfo(); //創(chuàng)建供應(yīng)商實體對象
gysInfo.setId(item.getId()); //初始化供應(yīng)商實體對象
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) //更新供應(yīng)商信息
JOptionPane.showMessageDialog(GysXiuGaiPanel.this, "修改完成");
else
JOptionPane.showMessageDialog(GysXiuGaiPanel.this, "修改失敗");
}
}
(5)創(chuàng)建DelActionListener類,該類是“刪除”按鈕的事件監(jiān)聽器,它必須實現(xiàn)ActionListener接口,并在actionPerformed()方法中獲取當(dāng)前選擇的供應(yīng)商,然后調(diào)用Dao類的delete()方法從數(shù)據(jù)庫中把該供應(yīng)商刪除。關(guān)鍵代碼如下:
例程21 代碼位置:光盤\TM\01\JXCManager\src\internalFrame\gysGuanLi\GysXiuGaiPanel.java
class DelActionListener implements ActionListener { //“刪除”按鈕的事件監(jiān)聽器
public void actionPerformed(ActionEvent e) {
Item item = (Item) gys.getSelectedItem(); //獲取當(dāng)前選擇的供應(yīng)商
if (item == null || !(item instanceof Item))
return;
int confirm = JOptionPane.showConfirmDialog( //彈出確認(rèn)刪除對話框
GysXiuGaiPanel.this, "確認(rèn)刪除供應(yīng)商信息嗎?");
if (confirm == JOptionPane.YES_OPTION) { //如果確認(rèn)刪除
int rs = Dao.delete("delete tb_gysInfo where id='" //調(diào)用delete()方法
+ item.getId() + "'");
if (rs > 0) {
JOptionPane.showMessageDialog(GysXiuGaiPanel.this, //顯示刪除成功對話框
"供應(yīng)商:" + item.getName() + "。刪除成功");
gys.removeItem(item);
} else {
JOptionPane.showMessageDialog(GysXiuGaiPanel.this,
"無法刪除客戶:" + item.getName() + "。");
}
}
}
}
1.7.5 單元測試
在現(xiàn)代軟件開發(fā)過程中,單元測試成為與編寫代碼同步進(jìn)行的開發(fā)活動。單元測試能夠提高程序員對程序的信心,保證程序的質(zhì)量,加快軟件開發(fā)速度,使程序易于維護(hù)。
1.單元測試概述
單元測試是在軟件開發(fā)過程中要進(jìn)行的最低級別的測試活動。在單元測試活動中,軟件的獨立工作單元將在與程序的其他部分相隔離的情況下進(jìn)行測試。
在傳統(tǒng)的結(jié)構(gòu)化編程語言中,如Java語言,要進(jìn)行測試的工作單元一般是方法。在像C++這樣的面向?qū)ο蟮恼Z言中,要進(jìn)行測試的基本單元是類。單元測試不僅僅是作為無錯編碼的一種輔助手段在一次性的開發(fā)過程中使用,還必須是可重復(fù)的,無論是在軟件修改或是移植到新的運(yùn)行環(huán)境的過程中。因此,所有的測試都必須在整個軟件系統(tǒng)的生命周期中進(jìn)行。
2.什么是單元測試
它是一種驗證行為
程序中的每一項功能都可以通過單元測試來驗證其正確性,為以后的開發(fā)提供支持。就算是開發(fā)后期,也可以輕松地增加功能或更改程序結(jié)構(gòu),而不用擔(dān)心這個過程中會破壞重要的東西。而且,它為代碼的重構(gòu)提供了保障。這樣,我們就可以更自由地對程序進(jìn)行改進(jìn)。
它是一種設(shè)計行為
編寫單元測試將使我們從調(diào)用者的角度觀察、思考。特別是先寫測試(test-first),迫使我們把程序設(shè)計成易于調(diào)用和可測試的,即迫使我們解除軟件中的耦合。
它是一種編寫文檔的行為
單元測試是一種無價的文檔,它是展示函數(shù)或類如何使用的最佳文檔。這份文檔是可編譯、可運(yùn)行的,它永遠(yuǎn)保持與代碼同步。
3.越到項目后期,單元測試為何越難進(jìn)行
在很多項目的初期,項目中的大部分程序員都能夠自覺地編寫單元測試。但隨著項目的進(jìn)展、任務(wù)的加重,離交付時間越來越近,不能按時完成項目的風(fēng)險越來越大,單元測試就往往成為犧牲品了。項目經(jīng)理因為進(jìn)度的壓力也不重視了,程序員也因為編碼的壓力和無人看管而不再為代碼編寫單元測試了。筆者親身經(jīng)歷的項目都或多或少地發(fā)生過類似這樣的事情。越是在項目的后期,能夠堅持編寫單元測試的程序員在整個項目組中所占比例越來越低。
為了追趕項目進(jìn)度,多數(shù)程序員將沒有經(jīng)過任何測試的程序代碼上傳到版本控制系統(tǒng),項目經(jīng)理也不再追問,照單全收。這樣做的結(jié)果就是在項目后期,技術(shù)骨干人員只好加班加點進(jìn)行系統(tǒng)集成。集成完成之后,下發(fā)給測試人員測試時,Bug的報告數(shù)量翻倍增長。程序員開始修改Bug,但有非常多的Bug隱藏得很深,一直潛伏到生產(chǎn)環(huán)境中去。
4.JUnit單元測試工具的介紹與使用
JUnit使用介紹
JUnit是一個單元測試框架,專門用于測試Java開發(fā)的程序。同類產(chǎn)品還包括Nunit(.NET)、CPPUnit(C++),都屬于xUnit中的成員。目前JUnit的最新版本是JUnit 4.0,在Eclipse開發(fā)工具中已經(jīng)集成了JUnit的多個版本。
在正式講解JUnit之前,先來看一下單元測試的運(yùn)行效果,如圖1.23和圖1.24所示。
在圖1.23和圖1.24中很容易發(fā)現(xiàn)不同顏色的警示條,圖1.23所示是綠色的,圖1.24所示是紅色的。如果所有測試案例運(yùn)行成功,就為綠色;反之,如果有一個不成功,則為紅色。
? 使用JUnit進(jìn)行單元測試
下面開始按步驟講解如何在Eclipse中使用JUnit工具。
(1)為單元測試代碼創(chuàng)建一個Java項目,將其命名為JUnitTest。
(2)創(chuàng)建ItemTest類,該類用于測試公共類Item的行為(即方法)。在“創(chuàng)建Java類”對話框中設(shè)置該類的超類為TestCase,也就是繼承JUnit框架的測試用例編寫單元測試,單擊“完成”按鈕,如圖1.25所示。
(3)在項目的構(gòu)建路徑中添加JUnit類庫。右擊項目名稱,在彈出的快捷菜單中選擇“構(gòu)建路徑”/“添加庫”命令,在彈出的“添加庫”對話框中選擇Junit選項,單擊“下一步”按鈕,如圖1.26所示。