4

Я пытаюсь запустить Activity в Espresso. Дело в том, что я хочу поместить смешные дополнения в Intent, который я использую для запуска Activity. Вот пример.Эксклюзивные задания с надписями в эспрессо-тестах

@RunWith(AndroidJUnit4.class) 
public final class NiceActivityTester 
{ 
    @Rule 
    public final ActivityTestRule<NiceActivity> activityRule = new ActivityTestRule<>(NiceActivity.class, true, false); 

    @Test 
    public void justStartPlease() { 
     NiceThing niceThing = Mockito.mock(NiceThing.class); 
     Mockito.when(niceThing.getName()).thenReturn("Nice!"); 

     Intent intent = new Intent(InstrumentationRegistry.getTargetContext(), NiceActivity.class); 
     intent.putExtra("NICE_THING", niceThing); 

     activityRule.launchActivity(intent); 
    } 
} 

К сожалению, unmarshalling Parcelable не удается.

java.lang.RuntimeException: Unable to start activity ComponentInfo{app.application/app.application.activity.NiceActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: NiceThing_Proxy 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
    at android.app.ActivityThread.access$800(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: NiceThing_Proxy 
    at android.os.Parcel.readParcelableCreator(Parcel.java:2295) 
    at android.os.Parcel.readParcelable(Parcel.java:2245) 
    at android.os.Parcel.readValue(Parcel.java:2152) 
    at android.os.Parcel.readArrayMapInternal(Parcel.java:2485) 
    at android.os.BaseBundle.unparcel(BaseBundle.java:221) 
    at android.os.Bundle.getParcelable(Bundle.java:755) 
    at android.content.Intent.getParcelableExtra(Intent.java:5088) 
    at app.application.NiceActivity.getNiceThing(NiceActivity.java:40) 
    at app.application.NiceActivity.setUpToolbar(NiceActivity.java:30) 
    at app.application.NiceActivity.onCreate(NiceActivity.java:20) 
    at android.app.Activity.performCreate(Activity.java:5990) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
    at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:534) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 

Есть ли способ использовать издевались статистов с Intent? Может быть, некоторые лучшие практики в этой области?

Я действительно не хочу создавать конструкторы для каждой модели, которую я использую, некоторые из этих классов довольно сложны с десятком полей. Шпионаж по дополнительному или Intent с использованием Mockito не помогает.

+0

проверить это: https://google.github.io/android-testing-support-library/docs/espresso/intents/index .html (особенно раздел «stuncbing») – piotrek1543

+0

«Intent» stubbing предназначен для издевательств при использовании 'Activity # startActivityForResult'. Это не применимо в моем случае. –

+0

Не могли бы вы решить вашу проблему? Если да, то отправьте решение –

ответ

7

Используйте ActivityTestRule и переопределить getActivityIntent

Пример найдено here

public class MainActivityLaunchIntentTest { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = 
      new ActivityTestRule<MainActivity>(MainActivity.class) { 
       @Override 
       protected Intent getActivityIntent() { 
        Context targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 
        Intent result = new Intent(targetContext, MainActivity.class); 
        result.putExtra("Name", "Earth"); 
        return result; 
       } 
      }; 

    @Test 
    public void shouldShowHelloEarth() { 
     onView(withId(R.id.main__tv_hello)).check(matches(withText("Hello Earth!"))); 
    } 
} 
Смежные вопросы