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)。

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
實際上是一個DatabaseReader
or ExternalServiceCaller
。不是在單元測試中測試真實的數(shù)據(jù)庫(祝你好運),而是創(chuàng)建一個FakeDatabaseReader
在常規(guī) Java 上運行的數(shù)據(jù)庫HashMap
,一切都很容易測試。
或者當(dāng)您的代碼處理時間/日期時,想象一個功能只在29th February
- 您可以等待 4 年來測試它,或者為Clock
您的測試提供一個設(shè)置為特定日期的對象。該類Clock
具有提供各種替代時鐘的靜態(tài)方法,以提供固定時刻、調(diào)整到未來或過去的時刻,或具有改變節(jié)奏的時鐘。

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)該有助于歸檔你想做的事情。

TA貢獻(xiàn)1848條經(jīng)驗 獲得超2個贊
不是我知道的,你會處理這些外部因素,或者在 A、B 或 C 類本身的開發(fā)過程中確保在測試過程中不會出現(xiàn)此類問題。
但是,如果您無法控制 A、B 或 C 類源,那么我認(rèn)為您被卡住了!
添加回答
舉報