2

У меня есть приложение для Android. Когда пользователь нажимает на кнопку А и намерения обжигают как этот андроид-presudocode :)тестирование Намерение в android

//inside FirstActivity 
@Override 
public void onClick(View view) { 
    startActivity(new Intent(this, AnotherActivity.class)); 
} 

Так что, если я не ошибаюсь, метод onResume в AnotherActivity следует назвать, не так ли?

Я использую ActivityInstrumentationTestCase2<FirstActivity>, чтобы проверить свою активность, но я не могу создать экземпляр AnotherActivity.

Итак, вопрос в том, как я могу проверить это: «Когда нажата кнопка, правильная активность возобновляется, и правильные дополнения передаются в намерение».

ответ

8

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

ActivityMonitor am = getInstrumentation().addMonitor(Activity3.class.getName(), null, true; 

Затем вы хотите использовать button.performClick() для «нажатия кнопки». Наконец, вы проверяете, был ли установлен монитор активности.

am.waitForActivitywithTimeout(timeout); 
assertEquals(1, am.getHits()); 

Я не использовал ActivityInstrumentationTestCase2 в довольно долгое время, так что я не гарантирую эти шаги точно. В любом случае, я рекомендую вам взглянуть на Robolectric: замечательная модульная платформа для Android, которая изменит вашу жизнь. Это поможет вам преодолеть многие ситуации, которые трудно или невозможно протестировать с помощью любого из тестов инструментальной аппаратуры по умолчанию.

+0

+1 для удивительном Roboelectric :) – fernandohur

-1

Этот код может дать вам хорошую идею

Если вы звоните Activity1 --->Activity2

Вы можете отправить UserName этим методом

Intent intent = new Intent(getBaseContext(), Activity2.class); 
intent.putExtra("UserName ", UserName); 
startActivity(intent); 

Для retrive в Extra() в Activity2, вам нужен этот код

String UserName = (String) getIntent().getSerializableExtra("UserName ");

Надеется, что это помогает

Ниже Edit для лучшего понимания

public class Activity2 extends Activity { 
    private String UserName; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.activity_2); 
     UserName= (String) getIntent().getSerializableExtra("UserName"); 
     Log.i(Tag, "UserName: "+ UserName); 
    } 

    // you can call this method from click or where ever you want 
    private void AnyMethod() 
    { 
      Intent intent = new Intent(getBaseContext(), Activity3.class); 
      intent.putExtra("UserName ", UserName); 
      startActivity(intent); 
    } 

} 
-1
@Override 
public void onClick(View view) { 
    startActivity(new Intent(this, AnotherActivity.class)); 
} 

Ваш код не подходит в любое время.

Пример:

btn.setOnClickListener(new OnClickListener(
    @Override 
    public void onClick(View view) { 
     startActivity(new Intent(this, AnotherActivity.class)); 
    } 
)); 

Пожалуйста, замените это = CurrentActivity.это

Это выглядит следующим образом:

@Override 
public void onClick(View view) { 
    startActivity(new Intent(CurrentActivity.this, AnotherActivity.class)); 
} 

Make обеспечить ваш манифест этот код:

<Activity name=".AnotherActivity"> 
</Activity> 
+3

Я не думаю, что это то, что имел в виду, что ОП путем «тестирования». –

1

Так через некоторое время я хочу опубликовать решение, которое я использую почти всегда. Изначально мне понравилась @ решение aleph_null, но оказывается, что это делает тесты нестерпимо медленно, так это то, что я использую сейчас:

Во-первых, у меня есть interface

/** 
* Simple interface to launch other activities. 
*/ 
public interface ActivityLauncher { 

    /** 
    * Starts an activity with the Intent provided. 
    * @param intent an intent 
    */ 
    public void start(Context context, Intent intent); 

    /** 
    * 
    * Returns the intent as set by {@link #start(android.content.Context,  android.content.Intent) start} or null if not yet 
    * called. 
    * 
    * @return an intent or null 
    */ 
    public Intent getIntent(); 
} 

И у меня есть две реализации для этого:

/** 
* Default implementation of ActivityLauncher 
*/ 
public class DefaultActivityLauncher implements ActivityLauncher{ 

    private Intent intent; 

    public DefaultActivityLauncher(){} 

    @Override 
    public void start(Context context, Intent intent) { 
     this.intent = intent; 
     context.startActivity(intent); 
    } 

    @Override 
    public Intent getIntent() { 
     return intent; 
    } 
} 

и

/** 
* Mock implementation of ActivityLauncher that simply sets the intent but does not actually starts 
* an activity. 
*/ 
public class MockActivityLauncher implements ActivityLauncher { 

    private Intent intent; 

    @Override 
    public void start(Context context, Intent intent) { 
     this.intent = intent; 
    } 

    @Override 
    public Intent getIntent() { 
     return intent; 
    } 
} 

Затем я использую рамки инъекции зависимостей, как Dagger или подобное, как это:

public class MyActivity { 

    @Inject ActivityLauncher launcher; 

    public void onCreate(Bundle bundle){ 

     // some code omitted for brevity 
     findViewById(R.id.goToOtherActivityButton).setOnClick(new OnClickListener(){ 
      Intent intent = new Intent(getContext(), MyOtherActivity.class); 
      launcher.start(getContext(), intent); 
     }); 
    } 

    public ActivityLauncher getLauncher(){ 
     return launcher; 
    } 
} 

Тестирование в простом checkIntentIsValid(activity.geLauncher().getIntent())

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