Возможно ли выполнить модульное тестирование передатчика 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 не похож на мой теневой класс.
Обратите внимание, что пользовательский бегун больше не нужен с новейшим Robolectric. – Gabor