Я пытался выяснить, как провести модульное тестирование моего BroadcastReceiver, и я просмотрел StackOverflow и другие веб-сайты, но не могу найти решение своей проблемы.
В моей mainActivity у меня есть следующие две функции:
private void registerNetRcvr(){
if (!isRcvrRegistered) {
isRcvrRegistered = true;
registerReceiver(receiver, new IntentFilter("android.net.wifi.STATE_CHANGE"));
registerReceiver(receiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
NetworkHandler.NetworkInfo netInfo = NetworkHandler.handleBcastReceiver(context);
if (netInfo!=null){
handleInfoChange(netInfo);
} else {
handleInfoChange(null);
}
}
};
RegisterNetRcvr вызывается из функции onResume (и в равной степени у меня есть unregister, вызываемый из onPause).
Как видно из вышеизложенного, у меня есть функция (handleBcastReceiver), которая вызывается для обработки события onReceive, и, таким образом, у меня есть другой класс, который затем имеет множество частных функций, которые вызываются из этой функции.
Просто чтобы немного усложнить ситуацию... при вызове функции onReceive, как подробно описано выше, функция "handleBcastReceiver" затем должна будет "получить" правильные данные... и, таким образом, сделать вызов для фактического получения соответствующей системы данные следующим образом:
private static NetworkInfo getWiFiNetworkInfo(Context context) {
ConnectivityManager connManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
return connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
}
Я считаю, что я должен эмулировать поведение обратного вызова onReceive, но также, я думаю, эмулировать то, что будет возвращено системой во время вызова getWiFiNetworkInfo.
Я думаю, что для этого я должен использовать RoboElectric, поскольку он может скрывать BroadcastReceiver/ConnectivityManager. Я также посмотрел на Mockito, однако я считаю, что RoboElectric — это то, что мне нужно для этого, но я допускаю, что вполне могу ошибаться. Насколько мне известно, RoboElectric позволяет мне эмулировать «систему Android», а Mockito позволяет мне издеваться над своими собственными классами.
В настоящее время я просто не вижу, как протестировать BroadcastReceiver. Кроме того, я не совсем понимаю, должен ли я запускать эмулятор для этого или просто «запустить» свой модульный тест, поскольку «тень» должна содержать все, что мне нужно. Наконец, если бы я должен был затенить BroadcastReceiver, как мне заставить WIFI быть «включенным» или «отключенным» с помощью этого теневого процесса? На самом деле, должен ли я эмулировать BroadcastReceiver или просто ConnectivityManager... Я искренне запутался!
Что я сделал до сих пор, так это создал класс BroadcastReceiverTest в тестовом разделе моего приложения (а не в разделе «androidTest»). Я могу выполнять обычные простые модульные тесты для функций, я просто застрял в том, как эмулировать это «системное» поведение.
Как всегда, любая помощь приветствуется.