2017-12-05 25 views
1

robolectricを初めて使用しています.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を立ち上げ、私は正のボタンをクリックしてテストすることができる方法を知っていますか?事前に感謝し、すぐに誰かから聞きたいと思っています。

答えて

2

しばらくの間、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が適切なアクティビティのクラス名で呼び出されていることを確認します。

はその後、我々はこのようなテストケースを持っています。

したがって、残りの問題は、アクティビティが実際に解決され、立ち上げられることです。通常、私はこの時点で警告ダイアログアクションのテストを中止します。インテントを解決してアクティビティプロパティを開始できるかどうかは、この特定のテストケースの範囲外です。

+0

これは素晴らしい機能でした!本当にありがとう :) – Erika

関連する問題