17

私はゆっくりとユニットテストに夢中になっています。テスト駆動開発を使用して、できるだけ多くのソフトウェアを開発しようとしています。JUnitを使用してAndroidアプリケーションの単体テストを行っています。

私はBluetoothを使用するアプリに取り組んでおり、ユニットテストに苦労しています。BluetoothAdapterを使用して、ペアになって検出されたデバイスのリストを取得するアクティビティがあります。動作しますが、ユニットテストの方法を知りたいです。

ペアリングされたデバイスのリストを取得するには、BluetoothAdapterのインスタンスでgetBondedDevices()を呼び出します。問題は、このメソッド(またはアクティビティが呼び出す他のbluetoothAdapterメソッド)をスタブまたはモックする方法がわからないため、ペアになっているデバイスのさまざまなリストに対してアクティビティをテストできないことです。

Mockitoを使用するか、BluetoothAdapterをサブクラス化して、興味のあるメソッドをなんとかしてスタブ化することを考えましたが、これは最終クラスであるため、どちらも実行できません。

BluetoothAdapterまたは(私が知る限り)スタブまたはモックするのが困難または不可能な他のリソースを使用するプログラムをテストする方法についてのアイデアはありますか?別の例として、ソケットを使用するプログラムをどのようにテストしますか?

助けてくれてありがとう

aleph_null

4

1 に答える 1

6

アクティビティをテストするために、コードをリファクタリングできます。BluetoothDeviceProviderデフォルトの実装で a を導入します。

public interface BluetoothDeviceProvider {
    Set<BluetoothDevice> getBluetoothDevices();
}

public class DefaultBluetoothDeviceProvider implements BluetoothDeviceProvider {
    public Set<BluetoothDevice> getBluetoothDevices() {
        return new BluetoothAdapter.getDefaultAdapter().getBondedDevices();
    }
}

次に、この新しいインターフェイスをアクティビティに挿入します。

public class MyActivity extends Activity {
    private BluetoothDeviceProvider bluetoothDeviceProvider;

    public MyActivity(BluetoothDeviceProvider bluetoothDeviceProvider) {
        this.bluetoothDeviceProvider = bluetoothDeviceProvider;
    }

    protected void onStart() {
        Set<BluetoothDevice> devices = bluetoothDeviceProvider.getBluetoothDevices();
        ... 
    }
    ...
}

これで、アクティビティは単体テスト可能に見えます。ただし、BluetoothDevice はまだ最終的なものであり、アクティビティにモックを挿入することはできません。したがって、この新しいコードをリファクタリングし、BluetoothDevice をラップする新しいインターフェイスを導入する必要があります... -> コア Android クラスの抽象化レイヤー。

最後に、さまざまな単体テストを介してアクティビティの動作を確認できます...そのため、新しく導入されたインターフェイスの実装はテストする必要があります。これを行うには、次のことができます。

  • それらを(単体)テストしないでください。委任を行うだけなので、私にとっては大きな問題ではありません

  • PowerMockを見てください。

PowerMock を使用した最終クラスのモックについては、この wiki ページも確認してください。

于 2012-08-27T10:07:18.973 に答える