测试该按钮以Robolectric启动Activity

use*_*684 39 android android-intent robolectric android-activity

嗨,我有以下代码:

@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何测试压力按下的MeButton开始了一个新的活动.实际上确实如此,但是如何为这个事实编写正确的Robolectric单元测试呢?

Mic*_*chK 26

在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));
  }
}
Run Code Online (Sandbox Code Playgroud)

这与我正在做的类似.请注意,Activity通过调用创建new Activity()将使Robolectric打印关于不正确地创建活动的警告,这可能会更好...

  • 阴影:使用Shadows.shadowOf(),在Robolectric 3.0中更改.有关其他更改的进一步参考,请参阅本指南 (2认同)

Sco*_*ale 19

使用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));
    }  
}
Run Code Online (Sandbox Code Playgroud)

  • 当robolectric移动到2.0时,StartedMatcher被删除.不确定是什么,如果有的话,取而代之. (33认同)

小智 16

如上面的答案为3.1.2更新此更新对我不起作用: -

    loginButton.callOnClick();

    Intent startedIntent = shadowOf(activity).getNextStartedActivity();
    ShadowIntent shadowIntent = shadowOf(startedIntent);
    assertEquals(NextActivity.class, shadowIntent.getIntentClass()); 
Run Code Online (Sandbox Code Playgroud)


Ari*_*ski 7

受@ MichK的回答启发,这是一个完整的运行测试,使用buildActivityRobolectric 2.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)));
}
Run Code Online (Sandbox Code Playgroud)