тэставанне Intent ў андроіды

У мяне ёсць дадатак для Android. Калі карыстальнік націскае на кнопку А і намеры абпальваюць як гэты андроіда-presudocode :)

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

Так што, калі я не памыляюся, onResume метад AnotherActivity варта назваць, ці не так?

I use ActivityInstrumentationTestCase2 to test my activity but I'm unable to instantiate AnotherActivity.

Такім чынам, пытанне, як я магу праверыць гэта: «Калі кнопка націснутая, правільная дзейнасць аднаўляецца і правільныя дапаўненні перадаюцца намеры».

2

6 адказы

Вы можаце выкарыстоўваць прыборы, каб зрабіць ActivityMonitor . Гэта будзе кантраляваць, калі быў запушчаны новы від дзейнасці.

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

Затым вы хочаце выкарыстоўваць button.performClick (), каб «націснуць кнопку». Нарэшце, трэба праверыць, калі манітор актыўнасці быў уражаны.

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

Я не выкарыстоўваў ActivityInstrumentationTestCase2 ў даволі доўгі час, так што я не гарантую гэтыя крокі дакладна. У любым выпадку, я рэкамендую вам зірнуць на Robolectric : выдатная аснова модульнага тэставання для Android, які зменіць вашу жыццё , Гэта дапаможа вам пераадолець шматлікія сітуацыі, якія цяжка ці немагчыма праверыць з якім-небудзь з выпрабаванняў прыбораў па змаўчанні.

8
дададзена
+1 за дзіўны Roboelectric :)
дададзена аўтар fernandohur, крыніца

Вы можаце выкарыстоўваць прыборы, каб зрабіць ActivityMonitor . Гэта будзе кантраляваць, калі быў запушчаны новы від дзейнасці.

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

Затым вы хочаце выкарыстоўваць button.performClick (), каб «націснуць кнопку». Нарэшце, трэба праверыць, калі манітор актыўнасці быў уражаны.

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

Я не выкарыстоўваў ActivityInstrumentationTestCase2 ў даволі доўгі час, так што я не гарантую гэтыя крокі дакладна. У любым выпадку, я рэкамендую вам зірнуць на Robolectric : выдатная аснова модульнага тэставання для Android, які зменіць вашу жыццё , Гэта дапаможа вам пераадолець шматлікія сітуацыі, якія цяжка ці немагчыма праверыць з якім-небудзь з выпрабаванняў прыбораў па змаўчанні.

8
дададзена
+1 за дзіўны Roboelectric :)
дададзена аўтар fernandohur, крыніца

Гэты код можа даць вам добрую ідэю

If you are calling Activity1 --- > Activity2

Вы можаце адправіць код з дапамогай гэтага метаду

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

Для retrive ў Extra() у деятельности2 , вам трэба гэты код

<�Код> Радок UserName = (радок) 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
дададзена

Гэты код можа даць вам добрую ідэю

If you are calling Activity1 --- > Activity2

Вы можаце адправіць код з дапамогай гэтага метаду

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

Для retrive ў Extra() у деятельности2 , вам трэба гэты код

<�Код> Радок UserName = (радок) 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.this

Гэта выглядае наступным чынам:

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

Пераканайцеся, забяспечыць ваш маніфесту гэты код:



1
дададзена
Я не думаю, што гэта тое, што ОП азначае «тэставанне».
дададзена аўтар Steve Pomeroy, крыніца

Таму праз некаторы час я хачу апублікаваць рашэнне, якое я выкарыстоўваю амаль заўсёды. Першапачаткова мне спадабалася @ рашэнне aleph_null, але аказваецца, што гэта робіць тэсты нясцерпна павольна, так гэта тое, што я выкарыстоўваю зараз:

First, I have this 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(іroid.content.Context,     іroid.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;
    }
}

Затым я выкарыстоўваю рамку ін'екцыі залежнасцяў, як Кінжал або падобныя, як гэта:

 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;
    }
}

Testing is then as simple as checkIntentIsValid(activity.geLauncher().getIntent())

1
дададзена