2017-05-03 33 views
0

BluetoothDeviceという変数を持つクラスのユニットテストについて質問したいと思います。Androidユニットテスト:Bluetoothデバイスを模擬してパーセルに書き込む

私のオブジェクトは、いくつかのプリミティブ変数とBluetoothDevice変数を含む単純なオブジェクトです。私のオブジェクトもパーセル可能です。

最終的に私のコードはモバイルデバイス上で完全に機能しますが、単体テストを実行すると奇妙なエラーが発生します。

以下に示すようにIは、テストクラスにBluetoothDeviceをモック:私が使用する他のプリミティブのうち、私の目的で

@RunWith(RobolectricTestRunner.class) 
@Config(manifest=Config.NONE) 
public class BluetoothDeviceTest { 

    @Mock 
    BluetoothDevice device1; 

    @Before 
    public void initMocks(){ 
     MockitoAnnotations.initMocks(this); 

     when(device1.getAddress()).thenReturn("01:02:03:04:05:06"); 
     when(device1.getName()).thenReturn("device767b1"); 
     when(device1.getBondState()).thenReturn(BOND_NONE); 
    } 
} 

を:

  • Iは@Override public void writeToParcel(Parcel out, int flags)方法内側out.writeParcelable(mBluetoothDevice,0);を使用します。

  • コンストラクタ内にmBluetoothDevice = in.readParcelable(BluetoothDevice.class.getClassLoader());を使用します。私のオブジェクトインスタンスの個別のをテスト

ユニットテストは、例外もう一度私のコードは完全に正常に動作してたときに個別のは、私が仕事のモバイルアプリで良い作品がありますのでご注意ください java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

で失敗します。単体テストだけが変な動作をしています。

これは私の模倣したBluetoothDevice変数が通常の実際のインスタンスよりもパーセル内で短く、パーセル内のデータフィールドの順序が乱れているためです。

誰かが嘲笑でテストしたBluetoothDeviceを持っていますが、私には何かヒントはありますか?ありがとう

答えて

0

BLEデバイスに接続するには、アプリケーションがBluetoothDeviceオブジェクトを取得する必要があります。走査により

  • :これは 3つの方法のいずれかを用いて行うことができるBluetoothDeviceオブジェクトは、コールバック パラメータScanResultにおける各スキャンした広告パケットのために返されます。

  • BluetoothAdapter#getBondedDevices()を使用してボンディングされたデバイスのリストを取得します。

  • BluetoothAdapter#getRemoteDevice(String address)を使用してデバイスオブジェクトを作成します。

    • :BluetoothDeviceオブジェクトが最後の方法を用いて得られる(または新しい BluetoothDevice(アドレス)を持つ新しいオブジェクトを作成することによって)、それへの接続の試みがいる場合にのみ動作します

    デバイスは、パブリックアドレスを持っているか、接着されている、または

  • デバイスは、Bluetoothアダプタが開始されているので、接続試行 前に、少なくとも1回はスキャンされた

出典:https://devzone.nordicsemi.com/blogs/1046/what-to-keep-in-mind-when-developing-your-ble-andr/

関連する問題