2016-09-26 10 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が受け取った有効で正しいコマンドが返されることをテストします。

これは私の場合、コマンドクラスへのすべての変更が、周辺機器によって正しく読み取られるコマンドを送信していることを確認するのに非常に便利です。

私はhttp://nsubstitute.github.io/help/received-calls/を探しているものを正確に行う.NETライブラリがあります.JUnitやその他のAndroid用テストライブラリを使用してこれを行う方法が不思議です。

私は現在Mockitoを試していますが、私はこれを行うことができるライブラリを公開しています。

答えて

1

bleフィールドを置き換えることができれば、Mockitoで簡単に行うことができます。私は以下でコンストラクタの引数を使ってこのようにしましたが、セッターやフィールドでも同様に行うことができます。また、テストでの依存関係を置き換えても、実稼働環境でハードコードされたデフォルトの依存関係を使用できるように、可視性の低いコンストラクター/セッター/フィールドを選択することもできます。 (Androidライブラリクラスや変更不可能な静的ライブラリのような静的メソッド呼び出しや最終メソッド呼び出しの場合は、ラッパークラスを作成するか、より侵襲的なテストライブラリを使用する必要があります)

あなたのテストは、おおよそ次のようになります。あなたはそれに慣れてたら

// 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のアノテーションを)読ん。

関連する問題