在Java/Android中测试方法调用后的参数值



我有一个通过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注释)。

相关内容

  • 没有找到相关文章

最新更新