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