[英]Java: mock call to external library to test constructor
我正在嘗試對以下ClassA
類的ClassA(String)
構造函數進行單元測試:
import ExternalObject;
class ClassA{
private ExternalObject externalObject;
public ClassA() {
super();
}
public ClassA(String string) {
super();
this.externalObject = new ExternalObject().parseString(string);
}
}
我想模擬new ExternalObject().parseString(string)
調用,並使用示例ExternalObject
對象對其進行存根。
我已經研究了Mockito,但是看來Mockito無法完成此任務,因為:
new ExternalObject().parseString()
調用放在ClassA類的單獨方法中,也不能在沒有ClassA實例的情況下調用它。 是否可以在Mockito(或任何其他模擬庫)中執行此操作而無需重寫大量代碼? 我願意進行小的代碼更改,以使其更易於測試。
為了模擬ExternalObject
您必須能夠提供在測試流程中使用的ExternalObject
實例。
只要在 public ClassA(String string)
內部創建ExternalObject
這將很困難。
為了使您的ClassA
更具可測試性,您需要在構造ClassA
時提供一個ExternalObject
實例。
例如:
class ClassA{
private ExternalObject externalObject;
public ClassA() {
super();
}
public ClassA(ExternalObject externalObject, String string) {
super();
this.externalObject = externalObject.parseString(string);
}
}
然后可以如下進行測試:
public class ClasssATest {
@Test
public void someTest() {
String input = "a string";
ExternalObject externalObject = Mockito.mock(ExternalObject.class);
Mockito.when(externalObject.parseString(eq(input))).thenReturn(externalObject);
ClassA sut = new ClassA(externalObject, input);
...
}
}
這里的關鍵點是:將外部依賴項注入您的類中。 進行更改后,測試將變得更加容易,並且更一般地說,通過交換該外部依賴項的實現,此方法可以更輕松地更改系統行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.