3

我有一个安卓应用程序。当用户单击按钮 A 并像这样 android-presudocode 触发意图时:)

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

所以如果我没记错的话,应该调用里面的onResume方法,对吧?AnotherActivity

ActivityInstrumentationTestCase2<FirstActivity>用来测试我的活动,但我无法实例化AnotherActivity.

所以问题是,我如何测试这个:'当按下按钮时,正确的活动被恢复,正确的额外内容被传递给意图'。

4

4 回答 4

9

您可以使用仪器制作ActivityMonitor。这将监视是否已启动新活动。

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

然后你想使用 button.performClick() 来“按下按钮”。最后,您检查活动监视器是否已被击中。

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

我已经有一段时间没有使用 ActivityInstrumentationTestCase2 了,所以我不保证这些步骤是完全正确的。无论如何,我建议你看看Robolectric:一个很棒的 Android 单元测试框架,它将改变你的生活。它将帮助您克服许多难以或不可能使用任何默认仪器测试进行测试的情况。

于 2013-05-24T23:42:54.553 回答
2

所以一段时间后,我想发布我几乎总是使用的解决方案。最初我喜欢@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())

于 2014-10-30T23:57:58.100 回答
-1

这段代码可能会给你一个好主意

如果你打电话Activity1——>Activity2

您可以UserName通过此方法发送

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

要检索Extra()in Activity2,您需要此代码

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

希望这可以帮助

下面编辑以便更好地理解

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

 }
于 2013-05-24T23:12:43.450 回答
-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));
    }
));

请替换 this = CurrentActivity.this

看起来像:

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

确保您的清单具有以下代码:

<Activity name=".AnotherActivity">
</Activity>
于 2013-05-24T23:45:35.123 回答