17

我慢慢地沉迷于单元测试。我正在尝试使用测试驱动开发尽可能多地开发软件。我正在使用 JUnit 对我的 android 应用程序进行单元测试。

我一直在开发一个使用蓝牙的应用程序,并且很难对其进行单元测试。我有一个使用 BluetoothAdapter 获取配对和发现设备列表的活动。虽然它有效,但我想知道如何对其进行单元测试。

为了获得配对设备的列表,我在 BluetoothAdapter 实例上调用 getBondedDevices()。问题是我不知道如何存根或模拟此方法(或我的 Activity 调用的任何其他 bluetoothAdapter 方法),因此我无法针对不同的配对设备列表测试我的 Activity。

我考虑过使用 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 仍然是最终的,您不能在您的活动中注入模拟。所以你必须重构这个新代码并引入一个包装蓝牙设备的新接口...... - >核心android类的抽象层。

最后,可以通过各种单元测试检查活动行为......因此,新引入的接口的实现仍有待测试。为此,您可以:

  • 让他们不进行(单元)测试,对我来说不是什么大问题,因为他们只是做委托

  • 看看PowerMock

另请查看有关使用 PowerMock 模拟最终类的wiki 页面。

于 2012-08-27T10:07:18.973 回答