引用 :
oop的乙個很好的機制是使用抽象類,抽象類是不能被例項化的,只能提供給派生類乙個介面。設計人員通常使用抽象類來強迫實現人員從基類派生,這樣可以確保新的類包含一些期待的功能。 在
junit
對抽象類的測試中再次引入工廠設計模式,其測試思想是:抽象類不能被例項化,所以使用具體類測試抽象類是不可以的。因此,構造抽象類的測試類必須也是抽象的。該類需要強制宣告兩種型別的抽象方法。第一類抽象方法即工廠方法,返回所有被測試抽象類的具體子類例項,第二類定義抽象方法返回所有被測試抽象類的具體子類行為期望值。如下面**,
commodity
類是乙個商品抽象類,該類的抽象方法描述具體如下:
getcommodityname():
取商品名稱
changername():
修改商品名稱
getcommodityprice():
取商品**
changerprice():
修改商品**
commodity
類具體**如下
packagecom.fastpiont;
publicabstract classcommodity
commoditytestcase
是commodity
抽象類的測試類,同樣該類被宣告為抽象的。
commodity
抽象類包含了
getcommodity()
工廠方法返回具體類例項,因為這才是真正的被測試物件。
prepareandgetexpectedname()
、prepareandgetexpectedprice()
、prepareandchangerexpectedname()
、prepareandchangerexpectedprice()
四組方法分別返回具體類例項行為的期望值,即該例項行為的判斷基準,具體**如下:
packagecom.fastpiont;
importstaticorg.junit.assert.*;
importorg.junit.after;
importorg.junit.before;
importorg.junit.test;
publicabstract classcommoditytest
@after
public voidteardown()throwsexception
@test
public voidtestgetcommodityname()
@test
public voidtestchangername()
@test
public voidtestgetcommodityprice()
@test
public voidtestchangerprice() }
現在根據抽象類測試思想構造乙個整合了
commodity
抽象類的具體商品子類
commodity_book
,commodity_book
類的構造方法有兩個傳參,即根據傳入的書籍名稱值和書籍單價值生成一本書例項。
commodity_book
類不鼓勵直接修改書籍的屬性,但是可以通過連歌公共方法
changername()
和changerprice()
來實現,具體**如下:
packagecom.fastpiont;
publicclasscommodity_bookextendscommodity
public voidchangername(string newname)
public voidchangerprice(doublenewprice)
publicstring getbook_name()
private voidsetbook_name(string book_name)
public doublegetbook_price()
private voidsetbook_price(doublebook_price)
@override
publicstring getcommodityname()
@override
public doublegetcommodityprice() }
commodity_booktestcase
類繼承了
commoditytestcase
抽象類,整個類顯得非常簡單,包括工廠方法返回乙個具體的
commodity
例項和四個針對該例項的期望值設定,具體**如下:
package com.fastpiont;
import static org.junit.assert.*;
import org.junit.after;
import org.junit.before;
import org.junit.ignore;
import org.junit.test;
public abstract class commoditytest
@after
public void teardown() throws exception
@test
public void testgetcommodityname()
@test
public void testchangername()
@test
public void testgetcommodityprice()
@test
public void testchangerprice() }
這種針對抽象類的測試方法是
junit
推導者所主張的,好處在於該抽象類的所有具體子類都不用在測試抽象類中的所有抽象發發(抽象類中的具體方法除外,因為該方法可能被具體子類覆蓋),符合
xp測試的介面測試定義。
Junit實現抽象類測試(二)
引用 如果抽象類中包含了具體實現的方法,那麼使用 抽象類測試 一 中的抽象類測試方式就很勉強了,因為抽象類的具體方法有可能被繼承該抽象類的具體子類所覆蓋,導致測試偏差現象發生。對於這樣的測試場景,可以引入靜態內部類進行抽象類變相例項化測試,這裡引入commodity 抽象類實現這種設計,該類屬性,抽...
介面 抽象類 實現類
如上圖介面類list只具有方法,無法例項化,我們在使用時必須通過下面的實現類來使用list的方法。用乙個類 implements 介面,這樣這個類就可以使用介面中的方法了。2.不用implements,通過api文件下的另請參見 方法建立抽象類物件,2.1 比如介面connection connec...
實現抽象類之方式一
抽象類 是乙個開發的規範,約束它的所有子類必須實現一些和它同名的方法 class pay object 抽象類def pay self,money 只要見到專案中有這種類,你的子類中必須實現和play同名的方法 raise notimplementederror 請在子類中重寫與父類同名的方法 cl...