成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

依賴注入和單元測試-創(chuàng)新互聯(lián)

1. 一輛簡單的car

依賴注入和單元測試

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設、成都網(wǎng)站設計與策劃設計,雨花網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十載,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:雨花等地區(qū)。雨花做網(wǎng)站價格咨詢:18980820575

首先我們考慮一個簡單的例子,這里我們使用engine 類和car 類。為了更加清楚的描述問題,我們將類和接口都置空。每輛car會有一個engine,我們想給car裝備上著名的MooseEngine。

Engine類如下:

依賴注入和單元測試

 1 public interface Engine { 2 
 3 } 4 
 5 public class SlowEngine implements Engine { 6 
 7 } 8 
 9 public class FastEngine implements Engine {10 
11 }12 
13 public class MooseEngine implements Engine {14 
15 }

依賴注入和單元測試

然后我們可以得到一個car類:

1 public class Car {2 
3        private MooseEngine engine;4 
5 }

這是一輛非常棒的汽車,但是即使有其他種類的引擎上市,我們也不能裝備這些引擎了。我們說這里的car類和MooseEngine類是緊耦合的(tightly coupled)。雖然MooseEngine很棒,但是如果我們想把它換成別的引擎呢?

回到頂部

2. 接口編程

 你可能已經(jīng)注意到了MooseEngine實現(xiàn)了Engine接口。其它引擎也實現(xiàn)了同樣的接口。我們可以想一想,當我們設計我們的Car類時,我們想讓一輛“car”裝備一個“engine”。所以我們重新實現(xiàn)一個Car類,這次我們使用Engine接口:

1 public class Car {2 
3         private Engine engine;4 
5 }

接口編程是依賴注入中的一個很重要的概念。我聽到了你的尖叫,“等一下,你在這里使用接口,具現(xiàn)類(concrete class)該怎么辦?你在哪里設置(set)引擎?我想在我的汽車中裝備MooseEngine”。我們可以按下面的方式來設置它:

1 public class Car {2 
3         private Engine engine = new MooseEngine();4 
5 }

但這就是有用的么?它看上去和第一個例子沒有多大區(qū)別。我們的car仍然同MooseEngine是緊耦合的。那么,我們該如何設置(set或者說注入(inject))我們的汽車引擎呢?

回到頂部

3. 依賴注入介紹

就像依賴注入這個名字一樣,依賴注入就是注入依賴,或者簡單的說,設置不同實例之間的關系。一些人將它同好萊塢的一條規(guī)矩關聯(lián)了起來,“不要給我打掉話,我打給你?!蔽腋矚g叫它“bugger”法則:“我不關心你是誰,按我說的做?!痹谖覀兊牡谝粋€例子中,Car依賴的是Engine的具現(xiàn)類MooseEngine。當一個類A依賴于另外一個類B的時候,類B的實現(xiàn)直接在類A中設置,我們說A緊耦合于B。第二個例子中,我們決定使用接口來代替 具現(xiàn)類MooseEngine,這樣就使得Car類更加靈活。并且我們決定不去定義engine的具現(xiàn)類實現(xiàn)。換句話說,我們使Car類變?yōu)樗神詈?loosely coupled)的了。Car不再依賴于任何引擎的具現(xiàn)類了。那么在哪里指定我們需要使用哪個引擎呢?依賴注入該登場了。我們不在Car類中設置具現(xiàn)化的Engine類,而是從外面注入。這又該如何實現(xiàn)呢?

3.1 使用構造函數(shù)來注入依賴

設置依賴的一種方法是把依賴類的具體實現(xiàn)傳遞給構造函數(shù)。Car類將會變成下面這個樣子:

依賴注入和單元測試

 1 public class Car { 2 
 3         private Engine engine; 4 
 5         public Car(Engine engine) { 6 
 7                this.engine = engine; 8 
 9         }10 
11 }

依賴注入和單元測試

然后我們就可以用任何種類的engine來創(chuàng)建Car了。例如,一個car使用MooseEngine,另外一個使用crappy SlowEngine:

依賴注入和單元測試

 1 public class Test { 2 
 3         public static void main(String[] args) { 4 
 5                Car myGreatCar = new Car(new MooseEngine()); 6 
 7                Car hisCrappyCar = new Car(new SlowEngine()); 8 
 9         }10 
11 }

依賴注入和單元測試

3.2 使用setter來注入依賴

另外一種設置依賴的普通方法就使用setter方法。當需要注入很多依賴的時候,建議使用setter方法而不是構造函數(shù)。我們的car類將會被實現(xiàn)成下面的樣子:

依賴注入和單元測試

 1 public class Car { 2 
 3         private Engine engine; 4 
 5         public void setEngine(Engine engine) { 6 
 7                this.engine = engine; 8 
 9         }10 
11 }

依賴注入和單元測試

它和基于構造函數(shù)的依賴注入非常類似,于是我們可以用下面的方法來實現(xiàn)上面同樣的cars:

依賴注入和單元測試

 1 public class Test { 2 
 3         public static void main(String[] args) { 4 
 5                Car myGreatCar = new Car(); 6 
 7                myGreatCar.setEngine(new MooseEngine()); 8 
 9                Car hisCrappyCar = new Car();10 
11                hisCrappyCar.setEngine(new SlowEngine());12 
13         }14 
15 }

依賴注入和單元測試

回到頂部

4. 在單元測試中使用依賴注入

依賴注入和單元測試

如果你將Car類的第一個例子同使用setter依賴注入的例子進行比較,你可能認為后者使用了額外的步驟來實現(xiàn)Car類的依賴注入。這沒錯,你必須實現(xiàn)一個setter方法。但是當你在做單元測試的時候,你會感覺到這些額外的工作都是值得的。如果你對單元測試不熟悉,推薦你看一下這個帖子單元測試有毒 。我們的Car的例子太簡單了,并沒有把依賴注入對單元測試的重要性體現(xiàn)的很好。因此我們不再使用這個例子,我們使用前面已經(jīng)講述過的關于篝火故事的例子,特別是在在單元測試中使用mock中的部分。我們有一個servlet類,通過使用遠端EJB來在農(nóng)場中”注冊”動物:

依賴注入和單元測試

 1 public class FarmServlet extends ActionServlet { 2 
 3         public void doAction( ServletData servletData ) throws Exception { 4 
 5                String species = servletData.getParameter("species"); 6 
 7                String buildingID = servletData.getParameter("buildingID"); 8 
 9                if ( Str.usable( species ) && Str.usable( buildingID ) ) {10 
11                        FarmEJBRemote remote = FarmEJBUtil.getHome().create();12 
13                        remote.addAnimal( species , buildingID );14 
15                }16 
17         }18 
19 }

依賴注入和單元測試

你已經(jīng)注意到了FarmServlet被緊耦合到了FarmEJBRemote實例中,通過調用“FarmEJBUtil.getHome().create()”來取回實例值。這么做會非常難做單元測試。當作單元測試的時候,我們不想使用任何數(shù)據(jù)庫。我們也不想訪問EJB服務器。因為這不僅會使單元測試很難進行而且會使其變慢。所以為了能夠順利的為FarmServlet類做單元測試,最好使其變成松耦合的。為了清除FarmServlet和FarmEJBRemote之間的緊依賴關系,我們可以使用基于setter的依賴注入:

依賴注入和單元測試

 1 public class FarmServlet extends ActionServlet { 2 
 3         private FarmEJBRemote remote; 4 
 5         public void setRemote(FarmEJBRemote remote) { 6 
 7                this.remote = remote; 8 
 9         }  
10 
11         public void doAction( ServletData servletData ) throws Exception {12 
13                String species = servletData.getParameter("species");14 
15                String buildingID = servletData.getParameter("buildingID");16 
17                if ( Str.usable( species ) && Str.usable( buildingID ) ) {18 
19                        remote.addAnimal( species , buildingID );20 
21                }22 
23         }24 
25 }

依賴注入和單元測試

在真實的部署包中,我們確保通過調用“FarmEJBUtil.getHome().create()”而創(chuàng)建的一個FarmServlet遠端成員實例會被注入。在我們的單元測試中,我們使用一個虛擬的mock類來模擬FarmEJBRemote。換句話說,我們通過使用mock類來實現(xiàn)FarmEJBRemote:

依賴注入和單元測試

 1 class MockFarmEJBRemote implements FarmEJBRemote { 2 
 3         private String species = null; 4 
 5         private String buildingID = null; 6 
 7         private int nbCalls = 0; 8 
 9         public void addAnimal( String species , String buildingID )10 
11         {12 
13                this.species = species ;14 
15                this.buildingID = buildingID ;16 
17                this.nbCalls++;18 
19         }20 
21         public String getSpecies() {22 
23                return species;24 
25         }26 
27         public String getBuildingID() {28 
29                return buildingID;30 
31         }32 
33         public int getNbCalls() {34 
35                return nbCalls;36 
37         }38 
39 }40 
41  
42 
43 public class TestFarmServlet extends TestCase {44 
45         public void testAddAnimal() throws Exception {46 
47                // Our mock acting like a FarmEJBRemote48 
49                MockFarmEJBRemote mockRemote = new MockFarmEJBRemote();50 
51                // Our servlet. We set our mock to its remote dependency52 
53                FarmServlet servlet = new FarmServlet();54 
55                servlet.setRemote(mockRemote);56 
57            
58 
59                // just another mock acting like a ServletData60 
61                MockServletData mockServletData = new MockServletData(); 
62 
63                mockServletData.getParameter_returns.put("species","dog");64 
65                mockServletData.getParameter_returns.put("buildingID","27");66 
67  
68 
69                servlet.doAction( mockServletData );70 
71                assertEquals( 1 , mockRemote.getNbCalls() );72 
73                assertEquals( "dog" , mockRemote.getSpecies() );74 
75                assertEquals( 27 , mockRemote.getBuildingID() );76 
77         }78 
79 }

依賴注入和單元測試

這樣很容易就能測試FarmServlet了。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

標題名稱:依賴注入和單元測試-創(chuàng)新互聯(lián)
瀏覽路徑:http://jinyejixie.com/article42/jjdec.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、用戶體驗、Google、網(wǎng)站維護、網(wǎng)站策劃、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
堆龙德庆县| 大田县| 玛沁县| 曲松县| 侯马市| 和林格尔县| 双牌县| 甘德县| 太谷县| 通辽市| 镇坪县| 连平县| 伊川县| 涿州市| 刚察县| 邓州市| 闸北区| 阿勒泰市| 嘉峪关市| 临桂县| 深泽县| 增城市| 沿河| 许昌市| 鹤庆县| 怀远县| 马关县| 灌南县| 洛宁县| 衡阳县| 远安县| 平果县| 渝中区| 东丽区| 司法| 孝义市| 繁昌县| 固始县| 大邑县| 洛扎县| 筠连县|