簡體   English   中英

如何重用測試實現?

[英]How can I reuse test implementation?

我開始為不同的算法創建 JUnit 測試,但很快我意識到大部分時間,我編寫相同的代碼,所以我決定集中這些部分。

與其對數據庫進行多次調用,我更喜歡創建一個模擬,並從 CSV 讀取值。 我模擬每個負責調用 DB 並返回值的提供者。

假設我有以下提供者:A、B、C、D、E、F。
我為每一個創建了一個抽象的 class,我有一些方法,一個從 csv 讀取值,另一個用於過濾結果並在 when-thenReturn 語句中使用它:AMock、BMock、CMock、DMock、EMock、FMock。

我知道我無法創建擴展所有這些類的測試,所以目前,我使用以下解決方法:

EMock 擴展了 FMock
DMock 擴展了 EMock
CMock 擴展了 DMock
BMock 擴展了 CMock
AMock 擴展了 BMock

MyTest1 擴展 AMock
MyTest2 擴展了 AMock
MyTest3 擴展了 CMock

等等

但我不是很喜歡它,因為我不是每次都需要它,
例如,如果 MyTest2 只需要 AMock 和 EMock,擴展 AMock 我擁有它們。

有沒有更優雅的方法?

而不是 inheritance 我寧願使用組合(依賴注入)來實現這種抽象(可重用性)

像這樣:

class MyTest1 {

  @Mock
  private AMock aMock;

  ...
  
}

當然,您可以使用 inheritance 來避免 BMock、CMock 中的重復。 等等,但即使在這里,我寧願使用組合來實現相同的目標。 如果想要強制執行某些行為(通常通過構造函數和抽象方法),通常應該使用 inheritance。

在您的情況下(據我了解),您對每個模擬獨立提供的功能更感興趣。

如果 EMock 在內部使用 BMock... 的方法來完成其任務:

class EMock {

  @Mock
  private AMock aMock;
   
  @Mock
  private BMock aMock;

  ...
  
}

如果 EMock 中沒有使用任何來自 BMock 的內容:

class MyTest1 {

  @Mock
  private AMock aMock;

  @Mock
  private BMock bMock;

  ...

  @Mock
  private EMock eMock;

  
  // futher methods where aMock.doSomeStuff() ... is called.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM