【JAVA-UT】13、什麼是stub
約翰接到一個任務,為下面這個類寫ut。
public class NameChecker { private NameLoader nameLoader; public NameChecker(NameLoader in) { nameLoader = in; } public boolean nameIsOnServer(String addr, String name) { List nameList = nameLoader.download(addr); if (nameList.contains(name)) { return true; } return false; } }
這個類的功能為檢查一個名字是否在伺服器上。addr是伺服器地址,name是被檢查的名字。
約翰認為很簡單。
他的思路是:
首先,找到一個伺服器,預先存一些名字進去;
然後,連線這個伺服器,得到這些名字;
最後,檢查這串名字有沒有指定的名字。
要解決的第一個問題是,找到一個伺服器。這個伺服器還要滿足條件:專門為這個UT而存在。因為ut會在jenkins上執行,每天執行。如果伺服器被別人拿去用了,或者裡面的資料被修改了,ut就不能如期運行了。
能找到符合這種條件的伺服器嗎?
即使有,這也太不合理了吧,太浪費了。
於是約翰將這方法上面畫個了叉。
有沒有其他辦法?
他不知道。於是去請教珍妮。
珍妮一聽,答道:stub。
約翰問:什麼是stub ? 怎樣用呢?
珍妮寫出下面這個類,告訴約翰,這就是一個stub:
public class NameLoaderStub extends NameLoader { @Override public List download(String addr) { List<String> nameList = new ArrayList<String>(); nameList.add("a"); nameList.add("b"); nameList.add("c"); return nameList; } }
原來的download方法被override。根據ut的目標,重寫成特定的樣子。
在ut中,使用NameLoaderStub,而不是NameLoader。
ut 如下:
public class NameCheckerTest { private NameChecker nameChecker; @Before public void setUp() { NameLoader nameLoader = new NameLoaderStub(); nameChecker = new NameChecker(nameLoader); } @Test public void shouldTrue(){ String ladp_addr = "ldap://10.56.78.23:636"; String name = "c"; boolean result = nameChecker.nameIsOnServer(ladp_addr, name); assertTrue(result); } }
約翰一看,拍手稱讚。他將ut補充完整後,總結如下:
當被測試的類A需要協作的類B、C、D時,使用協作類的stub類。一個stub類,它的行為是預先安排好了的。