簡體   English   中英

Java:對外部庫的模擬調用以測試構造函數

[英]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無法完成此任務,因為:

  • Mockito只能模擬方法,而不能模擬方法中的語句。
  • 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.

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