2016-09-26 34 views
0

我有一個通過BLE連接到外設的應用程序。外圍設備設置爲接受來自設備的特定命令集。Java/Android方法調用後測試參數值

這裏是發生了什麼

在命令類極其簡單的例子..

public void sendCommand(int what) { 
    switch(what) { 
     case 0: 
      ble.writeToDevice("PowerOnCmd"); 
      break; 
     case 1: 
      ble.writeToDevice("PowerOffCmd"); 
      break; 
    } 
} 

,並在 「BLE」 類

public void writeToDevice(String command) { 
    //sets characteristic value 
    //and writes it 
} 

我希望能夠到測試對sendCommand(1)的調用是否會導致writeToDevice接收到有效且正確的命令。

在我的情況下,這看起來非常有用,以確保命令類的所有更改仍然發送將由外設正確讀取的命令。

有一個.NET庫,正是我正在尋找的http://nsubstitute.github.io/help/received-calls/,我很好奇使用JUnit和/或任何其他Android測試庫的方式。

我目前正在嘗試Mockito,但將開放給任何圖書館,我將能夠做到這一點。

回答

1

如果您可以替換ble字段,您可以在Mockito中輕鬆完成此操作。我在下面做了一個構造函數的參數,但你也可以使用setter或field來完成。您也可以選擇具有有限可見性的構造函數/設置器/字段,以便可以替換測試中的依賴項,但在生產中使用硬編碼的默認依賴項。 (請注意,在靜態或最後的方法調用情況下,如針對Android類庫或不變的靜態庫,你需要編寫一個包裝類或使用更多的侵入性的測試庫; PowerMockRobolectric浮現在腦海中)

您的測試看起來大致是這樣的:

// Create a Mockito mock, which is an automatic subclass with 
// all of its methods overridden to track and verify every method call. 
BleService mockBleService = Mockito.mock(BleService.class); 

// Importantly, you need to make sure that your system under test calls this 
// new object instead of the default (real) dependency. 
Command commandUnderTest = new Command(mockBleService); 

// Now you interact with your Command exactly like you'd expect consumers to. 
commandUnderTest.sendCommand(0); 

// Using the static method Mockito.verify, you can confirm the call came through. 
verify(mockBleService).writeToDevice("PowerOnCmd"); 

一旦你熟悉,閱讀了Mockito documentation,尤其是頂級部分1(驗證),2(磕碰)和9(@Mock註解) 。