2015-06-03 1 views
3

Я пытаюсь использовать Robolectric (3.0 RC2) для написания некоторых автономных тестов для реализации SyncAdapter в приложении для Android. Приложение будет работать на телефонах с SIM-картами на фабриках, которые будут использовать Wi-Fi-соединение. Поэтому я бы хотел написать тесты против моего кода проверки подключения Wi-Fi.ShadowNetworkInfo всегда является TYPE_MOBILE при тестировании подключения WiFi с robolectric v3.0

Я написал простой тест, основанный на примерах, которые я нашел в Интернете, чтобы затенять ConnectionManager с целью имитации присутствия на Wi-Fi. Однако, несмотря на установку NetworkInfo в TYPE_WIFI, диспетчер соединений всегда возвращает тип NetworkInfo TYPE_MOBILE. Таким образом, окончательное утверждение моего testSimple терпит неудачу. Я пропустил шаг?

import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 

import test.app.BuildConfig; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.RobolectricGradleTestRunner; 
import org.robolectric.RuntimeEnvironment; 
import org.robolectric.Shadows; 
import org.robolectric.annotation.Config; 
import org.robolectric.shadows.ShadowConnectivityManager; 
import org.robolectric.shadows.ShadowNetworkInfo; 

import java.io.IOException; 

import static junit.framework.Assert.assertEquals; 
import static junit.framework.Assert.assertTrue; 



@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, manifest = "/src/main/AndroidManifest.xml") 
public class DownloadSyncAdapterTest { 

    private ConnectivityManager connectivityManager; 
    private ShadowConnectivityManager shadowConnectivityManager; 
    private ShadowNetworkInfo shadowOfActiveNetworkInfo; 

    @Before 
    public void setUp() throws IOException { 
     connectivityManager = getConnectivityManager(); 
     shadowConnectivityManager = Shadows.shadowOf(connectivityManager); 
     shadowOfActiveNetworkInfo = Shadows.shadowOf(connectivityManager.getActiveNetworkInfo()); 

    } 

    @Test 
    public void testSimple() { 

     NetworkInfo networkInfo = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, ConnectivityManager.TYPE_WIFI, 0, true, true); 
     shadowConnectivityManager.setNetworkInfo(ConnectivityManager.TYPE_WIFI, networkInfo); 

     NetworkInfo activeInfo = connectivityManager.getActiveNetworkInfo(); 
     assertTrue(activeInfo != null && activeInfo.isConnected()); 

     // Assertion fails: Returns TYPE_MOBILE 
     assertEquals(ConnectivityManager.TYPE_WIFI, activeInfo.getType()); 


    } 

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

} 
+0

Очень хороший вопрос. Отметьте свой ответ правильно, так как это! –

ответ

6

Оказалось, что я вызываю неправильный вызов API. Чтобы установить активную сетевую информацию в ShadowConnectionManager, правильным методом является setActiveNetworkInfo, а не setNetworkInfo.

Вот исправленный код:

import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 

import test.app.BuildConfig; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.RobolectricGradleTestRunner; 
import org.robolectric.RuntimeEnvironment; 
import org.robolectric.Shadows; 
import org.robolectric.annotation.Config; 
import org.robolectric.shadows.ShadowConnectivityManager; 
import org.robolectric.shadows.ShadowNetworkInfo; 

import java.io.IOException; 

import static junit.framework.Assert.assertEquals; 
import static junit.framework.Assert.assertTrue; 



@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, manifest = "/src/main/AndroidManifest.xml") 
public class DownloadSyncAdapterTest { 

    private ConnectivityManager connectivityManager; 
    private ShadowConnectivityManager shadowConnectivityManager; 
    private ShadowNetworkInfo shadowOfActiveNetworkInfo; 

    @Before 
    public void setUp() throws IOException { 
     connectivityManager = getConnectivityManager(); 
     shadowConnectivityManager = Shadows.shadowOf(connectivityManager); 
     shadowOfActiveNetworkInfo = Shadows.shadowOf(connectivityManager.getActiveNetworkInfo()); 

    } 

    @Test 
    public void testSimple() { 

     NetworkInfo networkInfo = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, ConnectivityManager.TYPE_WIFI, 0, true, true); 
     // Correct API call: use setActiveNetworkInfo instead of setNetworkInfo 
     shadowConnectivityManager.setActiveNetworkInfo(networkInfo); 

     NetworkInfo activeInfo = connectivityManager.getActiveNetworkInfo(); 
     assertTrue(activeInfo != null && activeInfo.isConnected()); 

     // Assertion now passes: Correctly returns TYPE_WIFI 
     assertEquals(ConnectivityManager.TYPE_WIFI, activeInfo.getType()); 


    } 

    private ConnectivityManager getConnectivityManager() { 
     return (ConnectivityManager)  RuntimeEnvironment.application.getSystemService(Context.CONNECTIVITY_SERVICE); 
    } 
+0

Спасибо за это! Методы отражения, похоже, не работают для API 21+, и я скорее использую API Robolectric напрямую. –

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

  • Нет связанных вопросов^_^