2

Возможно ли выполнить модульное тестирование передатчика GCM с помощью robolectric? Это мой блок:Robolectric и GoogleCloudMessaging

public void sendUpstream(Bundle data) 
{ 
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 
    String id = "trv2" + System.currentTimeMillis(); 
    try { 
      gcm.send(GCM_SENDER_ID + "@gcm.googleapis.com", id, data); 
    } catch (IOException e) { 
     printStackTrace(e); 
    } 
} 

Попытка проверить его с robolectric производит следующую трассировку стека:

java.lang.NullPointerException 
    at com.google.android.gms.gcm.GoogleCloudMessaging.zza(Unknown Source) 
    at com.google.android.gms.gcm.GoogleCloudMessaging.send(Unknown Source) 
    at com.google.android.gms.gcm.GoogleCloudMessaging.send(Unknown Source) 

Это кажется мне сказать, что вместо того, чтобы использовать тени класса robolectric напрямую пытается использовать GoogleCloudMessaging класса и сбоя, потому что тест не выполняется на устройстве.

Я попытался создать теневой класс GoogleCloudMessaging, чтобы узнать, будет ли это работать. Это тень:

@Implements(GoogleCloudMessaging.class) 
public class ShadowGCM { 

    Bundle data; 
    String to; 
    String msgId; 

    public ShadowGCM() {} 

    @Implementation 
    public void send(String to, String msgId, Bundle data) { 
     this.data = data; 
     this.to = to; 
     this.msgId = msgId; 
    } 
} 

Следующие анотации были добавлены в мой тестовый класс, чтобы заставить его работать.

@RunWith(MyTestRunner.class) 
@Config(manifest = "src/main/AndroidManifest.xml", shadows =  {ShadowGCM.class } , 
    constants = BuildConfig.class, sdk = Build.VERSION_CODES.KITKAT) 

MyTestRunner был обычай испытания бегун, который я создал, потому что просто положить атрибут «теней» в конфигурации аннотации не похоже на работу. Вот тестовый бегун.

public class MyTestRunner extends RobolectricGradleTestRunner { 

    public MyTestRunner(Class<?> klass) throws InitializationError { 
     super(klass); 

    } 


    @Override 
    public InstrumentationConfiguration createClassLoaderConfig() { 
     InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); 
     builder.addInstrumentedClass(ShadowGCM.class.getName()); 
     builder.addInstrumentedClass(ShadowInstanceID.class.getName()); 

     return builder.build(); 
    } 
} 

Но ведь эта работа. NullPointerException все еще там. Roboelectric не похож на мой теневой класс.

+0

Обратите внимание, что пользовательский бегун больше не нужен с новейшим Robolectric. – Gabor

ответ

3

Небольшая ошибка ... строка builder.addInstrumentedClass(..); указать класс, который может быть затенен. Вместо ShadowGCM в этот момент используйте GoogleCloudMessaging.

Часть manifest = "src/main/AndroidManifest.xml" может дать вам проблемы позже. Вместо этого вы должны взять манифест из каталога сборки, который уже выполняется RobolectricGradleTestRunner. Если у вас есть проблемы в AndroidStudio, прочитайте «Примечание для пользователей Linux и Mac» по адресу http://robolectric.org/getting-started/

+0

Вы тоже специалист по эспрессам? то посмотрите, знаете ли вы это http://stackoverflow.com/questions/33662404/espresso-webview-select-hidden-element thanks – middlestump