2016-09-28 88 views
0

我正在使用azure ARM方法,如配置虛擬機並列出所有使用java sdk的虛擬機。我想用mockito測試我的方法。我怎樣才能做到這一點,而不是原來的呼籲蔚藍。如何使用mockito測試Azure ARM API?

public class ListAllVM{ 
    public static Azure azure = null; 
    public void listAllVM() { 
    azure = getAuthentication(); 
    try { 
     int i = 0; 
     for (VirtualMachine VM : azure.virtualMachines().list()) { 
      System.out.println(++i + 
        " \n VM ID:-" + VM.id() + 
        " \n VM Name:-" + VM.name() + 
        "\n"); 
     } 
    } catch (CloudException | IOException | IllegalArgumentException e) { 
     log.info("Listing vm failed");  } 
    } 
} 

我正在面臨問題,同時得到vm的模擬列表。如何模擬外部API類。

+0

我僅僅侷限於N有人說你從來沒回來回答我的問題。請讓我知道,如果我能做點什麼讓它變得有價值/接受你的眼睛。 – GhostCat

回答

0

你的問題是:你寫測試代碼 - 通過使用靜態。一個快速的建議怎麼做不同的事情:

public class AzureUtils { 
    private final Azure azure; 

    public AzureUtils() { this ( getAuthentication(); } 
    AzureUtils(Azure azure) { this.azure = azure }; 

    public List<VM> getVms() { 
    return azure.virtualMachines.list(); 
    } 

在我的版本,你可以使用依賴注入插入一個嘲笑版本Azure.class的。現在,您可以使用任何種類的嘲諷框架(如EasyMock或Mokito)來提供(再次)返回模擬對象的Azure對象。

備案:我不確定你的代碼在哪裏得到getAuthentication() from;所以除非這是一個靜態導入;首先,代碼有問題。

換句話說:你想學習如何編寫可測試代碼;例如通過觀看這些videos

另一方面,一個評論說,Azure類是最終的;其構造函數是私有的。這是非常完美的:當你使用設計一個API時,最終的是一個表達意圖的強大工具。

從那裏來,你實際上是相當限制爲:

  • 如上面寫的:你創建了一個抽象像AzureUtils - 這樣你至少可以從設計決策的影響保護自己的代碼微軟
  • 啓用內的的Mockito新的實驗性功能,允許嘲弄final類
  • 您談談PowerMock(ITO)或JMockit
+0

Azure類是final的,並且具有私有構造函數,並且僅用於靜態上下文中。爲什麼微軟?爲什麼? – DRaehal

+0

@DRaehal啊,好吧。很多人認爲使用** final **在創建API時是一件好事 - 因爲在使用API​​時你的意圖非常清晰。我相應地更新了我的答案。讓我知道,如果這些變化使得答案在你眼中可能值得讚賞。 – GhostCat