45

こんにちは私は次のコードを持っています:

@RunWith(Test9Runner.class)
public class MainActivityTest 
{
    private MainActivity activity;
    private Button pressMeButton;

    @Before
    public void setUp() throws Exception 
    {
        activity = new MainActivity();
        activity.onCreate(null);
        pressMeButton = (Button) activity.findViewById(R.id.button1);
    }

    @Test
    public void shouldUpdateResultsWhenButtonIsClicked() throws Exception 
    {
        pressMeButton.performClick();
        ShadowActivity shadowActivity = shadowOf(activity);
        Intent intent = shadowActivity.getResultIntent();
        System.out.print(intent.toString());
    }
}

しかし、pressMeButtonを押すと新しいアクティビティが開始されることをテストする方法がわかりません。実際にはそうですが、この事実に対する正しいRobolectricユニットテストを作成するにはどうすればよいですか?

4

8 に答える 8

29

Robolectric 2.1.1では、Intent新規開始Activityが次の方法で発行されたかどうかを確認できます。

@RunWith(RobolectricTestRunner.class)
public class MyTest {
  private ShadowActivity shadowActivity;
  private MyActivity activity;

  @Before
  public void setup() {
    activity = new MyActivity();
    shadowActivity = Robolectric.shadowOf(activity);        
  }

  @Test
  public shouldStartNewActivityWhenSomething() {
    //Perform activity startup
    //Do some action which starts second activity, for example View::performClick()
    //...
    //Check Intent
    Intent intent = shadowActivity.peekNextStartedActivityForResult().intent;
    assertThat(intent.getStringExtra(MySecondActivity.EXTRA_MESSAGE)).isEqualTo("blebleble");
    assertThat(intent.getComponent()).isEqualTo(new ComponentName(activity, MySecondActivity.class));
  }
}

これは私がしていることに似ています。Activity呼び出して作成すると、アクティビティの作成が不適切であるというRobolectricの印刷警告が表示されることに注意してくださいnew Activity()。これは、おそらくより適切に行うことができます...

于 2013-11-27T07:23:48.033 に答える
20

上記の答えが私にはうまくいかなかったので、これを3.1.2に更新します:-

    loginButton.callOnClick();

    Intent startedIntent = shadowOf(activity).getNextStartedActivity();
    ShadowIntent shadowIntent = shadowOf(startedIntent);
    assertEquals(NextActivity.class, shadowIntent.getIntentClass()); 
于 2016-09-24T09:19:52.773 に答える
18

Robolectricを使用するStartedMatcher

@RunWith(Test9Runner.class) 
public class MainActivityTest  {
    private MainActivity activity;
    private Button pressMeButton;

    @Before
    public void setUp() throws Exception 
    {
        activity = new MainActivity();
        activity.onCreate(null);
        pressMeButton = (Button) activity.findViewById(R.id.button1);
    }

    @Test
    public void shouldStartNextActivityWhenButtonIsClicked() 
    {
        pressMeButton.performClick();
        assertThat(activity, new StartedMatcher(NextActivity.class));
    }  
}
于 2011-05-26T22:17:26.603 に答える
7

@MichKの回答に触発されて、buildActivityRobolectric2.2以降のメソッドチェーンを使用した完全な実行テストがあります。

@Test
public void testStartScheduleActivity() {
    HomeScreenActivity homeActivity = Robolectric.buildActivity(HomeScreenActivity.class).create().start().visible().get();
    ShadowActivity shadowHome = Robolectric.shadowOf(homeActivity);
    Button btnLaunchSchedule = (Button) homeActivity.findViewById(R.id.btnLaunchSchedule);
    Robolectric.clickOn(btnLaunchSchedule);

    assertThat(shadowHome.peekNextStartedActivityForResult().intent.getComponent(), equalTo(new ComponentName(homeActivity, ScheduleActivity.class)));
}
于 2014-05-05T19:46:46.683 に答える
2

JamesNevilleの答えは4.3で機能します。ただし、AndroidX API、Espresso、Kotlinを使用しました。

// scenario initialization is done in @Before setUp method, I did it here for brevity
val scenario = ActivityScenario.launch(MainActivity::class.java)

@Test fun test() {
    onView(withId(R.id.button_id)).perform(click())

    scenario.onActivity { activity ->
        val intent = shadowOf(activity).nextStartedActivity
        val shadowIntent = shadowOf(intent)

        assertEquals(SearchResultsActivity::class.java, shadowIntent.intentClass)
    }
}
于 2019-09-22T20:37:52.880 に答える
1
@Before
public void setUp() throws Exception {
    mMainActivity = Robolectric.buildActivity(MainActivity.class)
            .create().start().visible().get();

    shadowActivity =Shadows.shadowOf(mMainActivity);
    hourlyButton = (Button) mMainActivity.findViewById(R.id.hourlyButton);
}
@Test
public void hourlyActivityButtonTest() throws Exception {

   Thread.sleep(5000);
    hourlyButton.performClick();
    Intent intent = shadowActivity.peekNextStartedActivityForResult().intent;
    assertThat(intent.getComponent()).isEqualTo(new ComponentName(mMainActivity, HourlyForecastActivity.class));

}
于 2016-07-18T20:51:37.813 に答える
1

Robolectric3の場合は次のようになります。

        // Click on the image view
    mShareLocationImageView.performClick();

    // Check the startActivityForResult for ShareUserLocationActivity has been triggered
    ShadowActivity shadowActivity = Shadows.shadowOf(mChatWindowsActivity);
    Intent intent = shadowActivity.peekNextStartedActivityForResult().intent;
    assertThat(intent).hasComponent(new ComponentName(mChatWindowsActivity, ShareUserLocationActivity.class));
于 2016-07-20T13:50:18.153 に答える
-5

Androidで単体テストを使用したことがないので、これが機能するかどうかはわかりません。

開始するアクティビティでは、「インスタンス」と呼ばれる静的変数を作成できます。

private static TheActivitysName instance;

onCreateアクティビティで、インスタンス変数を設定します。

instance = this;

次に、この変数を取得するための静的メソッドを作成します。

public static TheActivitysName getInstance() {
    return instance;
}

テストでは、TheActivitysName.getInstance()でテストできます。nullの場合、アクティビティは開始されていません。nullと異なる場合は、アクティビティが作成されています。

ただし、アクティビティが作成される前に、チェックするコードが実行されるかどうかはわかりません。

于 2011-05-25T08:51:41.583 に答える