簡體   English   中英

如何為 AlertDialog 進行 Robolectric 測試

[英]How to make Robolectric Test for AlertDialog

我是 robolectric 的新手,我正在嘗試對創建 AlertDialog 的按鈕進行測試。 當按鈕被點擊時,一個 AlertDialog 是一個正面的按鈕,我想使用 Robolectric 點擊它,並測試它是否啟動了一個活動。 這是按鈕的代碼:

newUserButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(StartActivity.this);
            builder.setTitle(context.getResources().getString(R.string.start_title_message))
                    .setMessage(getResources().getString(R.string.start_dialog_message));
            builder.setPositiveButton(getString(R.string.start_confirm_message), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    startActivityForResult(new Intent(StartActivity.this, AvatarRoomActivity.class), 0);
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });
            AlertDialog dialog = builder.create();
            ColorDrawable drawable = new ColorDrawable(Color.WHITE);
            drawable.setAlpha(200);
            dialog.getWindow().setBackgroundDrawable(drawable);
            dialog.show();
        }
    });

有誰知道我如何測試單擊肯定按鈕,然后啟動 AvatarRoomActivity? 提前致謝,並希望盡快收到某人的來信。

我今天遇到了這個問題,不建議只為了測試而暴露私有函數。

Robolectric 提供了一個ShadowAlertDialog ,它可以檢測顯示的DialogAlertDialog

//get all shown dialogs    
ShadowAlertDialog.getShownDialogs()

//get single dialog  
(ShadowAlertDialog.getLatestDialog() as android.support.v7.app.AlertDialog)
    .getButton(AlertDialog.BUTTON_POSITIVE)
    .performClick()

//Continue the test

讓我們newUserButton忘記newUserButton 它與問題無關。

您將需要公開AlertDialog對象,以便在單元測試代碼中可以訪問它。 所以我假設你的活動在 StartActivity 中有這樣一個方法:

AlertDialog showDialog() {

    AlertDialog.Builder builder = new AlertDialog.Builder(StartActivity.this);
    builder.setTitle("This is title")
            .setMessage("Dialog Message");
    builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            startActivityForResult(new Intent(this, AvatarRoomActivity.class), 0);
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();

    return dialog;

}

那么newUserButton的點擊事件就調用了這個方法。

然后我們有這樣的測試用例:

@Test
public void testLaunchAvatarRoomWhenConfirm() {

    StartActivity startActivity = Robolectric.buildActivity(StartActivity.class).create().get();

    AlertDialog dialog = startActivity.showDialog();

    // Key part 1 : simulate button click in unit test
    Button confirm = dialog.getButton(Dialog.BUTTON_POSITIVE);
    confirm.performClick();

    // Key part 2 : Check that startActivityForResult is invoke
    ShadowActivity shadowActivity = shadowOf(startActivity);
    ShadowActivity.IntentForResult intentForResult = shadowActivity.getNextStartedActivityForResult();

    // assert that the proper request to start activity is sent
    ComponentName nextActivity = intentForResult.intent.getComponent();
    assertEquals(".AvatarRoomActivity", nextActivity.getShortClassName());

}

此測試方法驗證當單擊對話框的肯定按鈕時,使用正確的活動類名稱調用startActivityForResult

所以剩下的問題是我們如何確保活動真正得到解決和啟動。 通常我會在此時停下來測試警報對話框操作。 是否可以解析意圖和啟動活動屬性超出了此特定測試用例的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM