我有一个通过BLE连接到外设的应用程序。设置外围设备以接受来自设备的特定命令集。
下面是一个非常简单的例子
在命令类中…
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,但会向任何库开放,我将能够做到这一点。
您可以在Mockito中轻松地做到这一点,只要您可以替换ble
字段。我已经在下面用构造函数参数这样做了,但是您也可以用setter或字段这样做。您还可以选择使用有限可见性的构造函数/setter/字段,以便您可以替换测试中的依赖项,但在生产中使用硬编码的默认依赖项。(请注意,在静态或最终方法调用的情况下,如Android库类或不可更改的静态库,您需要编写包装器类或使用更具侵入性的测试库;我想到了PowerMock和robolelectric。)
您的测试将大致如下所示:
// 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文档,特别是顶层部分1(验证)、2(存根)和9 (@Mock注释)。