應用設計模式編寫(xiě)易于單元測試的代碼[4] 單元測試方法
Abstract Factory 是另一種被普遍運用的創(chuàng )建型模式,Abstract Factory 通過(guò)專(zhuān)門(mén)的 Factory Class 來(lái)封裝對象創(chuàng )建的職責,并通過(guò)實(shí)現 Abstract Factory 來(lái)完成不同的創(chuàng )建邏輯。如果被測試單元所使用的外部對象是通過(guò) Abstract Factory 創(chuàng )建的,則實(shí)現一個(gè)新的 Concrete Factory,并在此 Factory 中創(chuàng )建 Mock Objects 是一個(gè)比較好的解決辦法。對于 Factory 本身,則可以在 setUp 測試的時(shí)候指定新的 Concrete Factory ;此外,借助依賴(lài)注入框架(如 Spring 的 BeanFactory),通過(guò)依賴(lài)注入的方式將 Factory 注入也是一種不錯的解決方案。對于簡(jiǎn)單的依賴(lài)注入需求,可以考慮實(shí)現一個(gè)應用專(zhuān)有的依賴(lài)注入模塊,或者實(shí)現一個(gè)簡(jiǎn)單的實(shí)現加載器,即根據配置文件載入相應的實(shí)現,從而無(wú)需修改應用代碼,僅通過(guò)修改配置文件即可載入不同的實(shí)現,進(jìn)而方便地修改程序的運行路徑,執行單元測試。
下面的代碼實(shí)現了一個(gè)簡(jiǎn)單的 InstanceFactory:
// refer to http://www.opensc-project.org/opensc-java/export/100/trunk/
// pkcs15/src/main/java/org/opensc/pkcs15/asn1/InstanceFactory.java
packagecom.instancefactory.demo;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.lang.reflect.Modifier;
public class InstanceFactory {
private final Method getInstanceMethod;
public InstanceFactory(String type) {
Class clazz =null;
try {
clazz = Class.forName(type);
this.getInstanceMethod = clazz.getMethod("getInstance");
if(!Modifier.isStatic(this.getInstanceMethod.getModifiers())
|| !Modifier.isPublic(this.getInstanceMethod.getModifiers()))
throw new IllegalArgumentException(
"Method [" + clazz.getName()
+ ".getInstance(Object)] is not static public.");
} catch (NoSuchMethodException e) {
throw new IllegalArgumentException(
"Class [" + clazz.getName()
+ "] has no static getInstance(Object) method.", e);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("Class [" + type + "] is not found"); 軟件測試
}
}
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/