4

私はBroadcastReceiverのユニットテストの方法を理解しようとしていましたが、私はStackOverflowや他のウェブサイトを見てきましたが、私の問題の解決策を見つけることができません。私mainActivityでユニットBroadcastReceiverのテスト

私は、次の2つの機能があります。registerNetRcvrはonResume関数内から呼び出され

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); 
     } 
    } 
}; 

を(と同じように、私はonPauseから呼び出さ登録解除を持っています)。

上記から分かるように、私はonReceiveイベントを処理するために呼び出される関数(handleBcastReceiver)を持っているので、この関数から呼び出されるさまざまなプライベート関数を持つ別のクラスがあります。

上記のように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をエミュレートする必要があります...私は本当に混乱しています!

私がこれまで行ってきたことは、アプリケーションのテストセクション( 'androidTest'セクションではありません)にBroadcastReceiverTestクラスを作成することでした。私は関数で普通の単純な単体テストを行うことができますが、私はこの 'システム'の振る舞いをエミュレートする方法に固執しています。

いつものように、どんな助けも大歓迎です。

+0

問題があります - Androidアプリをテストするために、あなたが特定、検証可能な方法でそれを右にする必要があります。だからこそ、MVPとそのような技術は現在非常に普及しています。 – Divers

答えて

2

だから、私はそれを解決したと思う...もっと経験があれば、私にこれについてのフィードバックをしたいと思うなら、それは大歓迎です。

私は 'ブロードキャストレシーバ'についてもっと気にする必要はないと感じています。これは、 'handleBcastReceiver'関数が最終的に読み込まれるように、ConnectivityManagerをシャドーイングすることに悩まされる必要があります。だから、本当にそれが重要なのは、それが自分の行動にどのように作用するのかという「フィード」なのです。 onReceive関数が起動されると、それが行うのは「handleBcastReceiver」関数だけであり、その結果でUIを更新するので、ここで実際にテストする必要はありません。

私は以下を作成し、それは私のために働いています。テストデータを変更すると、テストは適切に失敗するため、これは満足できるものだと私は信じています。私は他の人が役に立つと思うかもしれないと思っています。私が言いましたように、私がやったことが正しいかどうかについてフィードバックを受けるのはとても嬉しいです。

私は、もちろん、この1つのだけのテストよりも多くを持っていますが、これは自分たち同様、こので立ち往生見つけた誰を助けるために十分だろうと感じた:)

最終的に私が管理すると言って喜んで

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 23, manifest = "/src/main/AndroidManifest.xml") 
public class NetworkStateHandlerUnitTest { 

    private static String NETWORK_TYPE_HSDPA = "HSDPA"; 
    private ConnectivityManager connectivityManager; 
    private ShadowConnectivityManager shadowConnectivityManager; 
    private Context context; 

    @Before 
    public void setUp() { 

    } 

    @Test 
    public void handleBroadcastReceiverWIFIConnected() { 

     context = RuntimeEnvironment.application.getApplicationContext(); 
     connectivityManager = getConnectivityManager(); 
     shadowConnectivityManager = Shadows.shadowOf(connectivityManager); 

     //Create shadow Network Info - Connected, WIFI, No Subtype, available, connected 
     NetworkInfo networkInfoShadow = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, ConnectivityManager.TYPE_WIFI, 0, true, true); 
     shadowConnectivityManager.setNetworkInfo(ConnectivityManager.TYPE_WIFI, networkInfoShadow); 

     NetworkHandler.NetworkInfo networkInfoResponse; 

     //Call the function under test 
     networkInfoResponse = NetworkHandler.handleBcastReceiver(context); 

     //Validate the response 
     assertEquals(networkInfoResponse.getNetworkType(), ConnectivityManager.TYPE_WIFI); 
    } 

    private ConnectivityManager getConnectivityManager() { 
     return (ConnectivityManager) RuntimeEnvironment.application.getSystemService(context.CONNECTIVITY_SERVICE); 
    } 
} 

同様BroadcastReceiverリスナーをテスト...場合には、あなたがこれを行う方法を知りたい...

@Test 
public void handleBrcastRcvrWifiConn() { 

    MainActivity activity = Robolectric.setupActivity(MainActivity.class); 
    TextView tvConnStatus = (TextView) activity.findViewById(R.id.tvConnectionState); 


    context = RuntimeEnvironment.application.getApplicationContext(); 
    connectivityManager = getConnectivityManager(); 
    shadowConnManager = Shadows.shadowOf(connectivityManager); 

    //Create shadow Network Info - Connected, WIFI, No Subtype, available, connected 
    NetworkInfo netInfoShadow = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, 
      ConnectivityManager.TYPE_WIFI, 0, true, true); 
    shadowConnManager.setNetworkInfo(ConnectivityManager.TYPE_WIFI, networkInfoShadow); 


    //Trigger BroadcastReceiver 
    RuntimeEnvironment.application.sendBroadcast(new Intent("android.net.wifi.STATE_CHANGE")); 

    //Validate result by checking value of textView 
    assertEquals("Connected", tvConnectionState.getText()); 

} 
+0

私はこの記事から多くのことを学びました... http://stackoverflow.com/questions/30625378/shadownetworkinfo-is-always-type-mobile-when-testing-wifi-connectivity-with - ロボ – greysqrl

関連する問題