第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在單元測試中避免外部輸入

在單元測試中避免外部輸入

慕無忌1623718 2023-02-23 18:09:38
我想對 a 進(jìn)行單元測試class A。這個類與其他類級聯(lián),所以class A創(chuàng)建了一個實例class B和class B的class C。像那樣:public class A {    public B b;    public A() {        this.b = new B();    }} public class B {    public C c;    public B() {        this.c = new C();    }} 如果現(xiàn)在類 C 在其構(gòu)造函數(shù)中讀取任何外部輸入,如文件或?qū)傩裕胰绾伪苊膺@種情況?我看不出你會如何模擬它,但是在測試時是否也有可能將外部因素排除在其他類之外?
查看完整描述

4 回答

?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗 獲得超5個贊

您在這里遇到的問題是您的類與其他類的特定實現(xiàn)緊密耦合,因此您的“單元”被迫一起測試所有這些類的行為。


避免這種情況的典型方法是使用依賴注入,使您的類與接口而不是特定類耦合。然后您可以模擬注入的接口以對單個類的行為進(jìn)行單元測試。


public class AImpl {

    public B b;

    public AImpl(B b) {

        this.b = b;

    }

}


public interface B {

    // methods

}


public class BImpl implements B {

    public C c;

    public BImpl (C c) {

        this.c = c;

    }

}

當(dāng)您創(chuàng)建AImpl生產(chǎn)代碼時,您現(xiàn)在必須為其提供特定的C實現(xiàn)。您可以這樣做new AImpl(new BImpl(new CImpl)),也可以使用像 Spring 這樣的依賴注入框架來為您計算出所有這些細(xì)節(jié)。


B當(dāng)您進(jìn)行單元測試時,您可以創(chuàng)建一個模擬或存根以具有您希望為該特定測試展示的行為,并將該存根傳遞給構(gòu)造函數(shù): new AImpl(myMockedB)。


查看完整回答
反對 回復(fù) 2023-02-23
?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗 獲得超6個贊

B您不應(yīng)該在類中創(chuàng)建實例A- 相反,您應(yīng)該B在創(chuàng)建時提供實例A- 它稱為Inversion of Control。流行的方法是使用依賴注入,例如使用 Spring 框架。

然后一切都變得簡單 - 當(dāng)您的類需要讀取帶有類的文件時FileReader,為了測試您可以創(chuàng)建一個“假”實現(xiàn),例如當(dāng)您調(diào)用時FileReader.readFile(),您的假實現(xiàn)將簡單地返回硬編碼字符串或流,具體取決于您想要什么。

這個概念真的很大,想象一下當(dāng)你FileReader實際上是一個DatabaseReaderor ExternalServiceCaller。不是在單元測試中測試真實的數(shù)據(jù)庫(祝你好運),而是創(chuàng)建一個FakeDatabaseReader在常規(guī) Java 上運行的數(shù)據(jù)庫HashMap,一切都很容易測試。

或者當(dāng)您的代碼處理時間/日期時,想象一個功能只在29th February- 您可以等待 4 年來測試它,或者為Clock您的測試提供一個設(shè)置為特定日期的對象。該類Clock具有提供各種替代時鐘的靜態(tài)方法,以提供固定時刻、調(diào)整到未來或過去的時刻,或具有改變節(jié)奏的時鐘


查看完整回答
反對 回復(fù) 2023-02-23
?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊

首先,由于您不能注入 B 類,因此所有此類都不是為了進(jìn)行溫和測試而設(shè)計的,請注意,由于您將任何新內(nèi)容添加到類中,這與對實例進(jìn)行硬編碼非常相似。


適當(dāng)?shù)姆绞綉?yīng)該是


  public class A {

    public B b;

    public A(B b) {

        this.b = b;

    }

}

請注意,您可以通過這種方式實例化類


A a = new A(b); 

這樣,b 可以是模擬或虛擬或存根或任何用于測試目的的對象。如果您面臨遺留代碼,您應(yīng)該重構(gòu)它以使其能夠被測試。如果這是您的設(shè)計,您應(yīng)該盡快重構(gòu)以使其可測試。


控制反轉(zhuǎn)和依賴注入應(yīng)該有助于歸檔你想做的事情。


查看完整回答
反對 回復(fù) 2023-02-23
?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗 獲得超2個贊

不是我知道的,你會處理這些外部因素,或者在 A、B 或 C 類本身的開發(fā)過程中確保在測試過程中不會出現(xiàn)此類問題。

但是,如果您無法控制 A、B 或 C 類源,那么我認(rèn)為您被卡住了!


查看完整回答
反對 回復(fù) 2023-02-23
  • 4 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號