2016-09-26 2 views
0

У меня есть приложение, которое подключается к периферийному устройству через BLE. Периферийное устройство настроено на прием определенного набора команд с устройства.Проверка значений параметров после вызова метода в Java/Android

Вот очень упрощенный пример того, что происходит

В классе команды ..

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, но буду открыт для любых библиотек, с которыми я смогу это сделать.

ответ

1

Вы можете сделать это легко в Mockito, если вы можете заменить поле ble. Я сделал это ниже с аргументом конструктора, но вы можете сделать это с помощью сеттера или поля. Вы также можете выбрать конструктор/сеттер ограниченной видимости/поле, чтобы вы могли заменять зависимости в тестах, но использовать жестко закодированные зависимости по умолчанию в производстве. (Обратите внимание, что в ситуациях со статическими или окончательными вызовами метода, например, для классов библиотеки Android или неизменяемых статических библиотек, вам нужно написать класс обертки или использовать библиотеки с более инвазивным тестированием, PowerMock и Robolectric.)

Ваш тест будет выглядеть примерно так:

// 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 documentation, в частности, разделы верхнего уровня 1 (проверки), 2 (заглушки) и 9 (@Mock аннотации) ,

Смежные вопросы