Тестирование этой кнопки запускает операцию с помощью Robolectric
Привет У меня есть следующий код:
@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 unit test для этого факта?
Ответы
Ответ 1
Использование 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));
}
}
Ответ 2
В 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
путем вызова new Activity()
сделает Robolectric предупреждениями печати о том, чтобы создать активность ненадлежащим образом, возможно, это может быть сделано лучше...
Ответ 3
Обновление этого параметра для 3.1.2, поскольку ответы выше не работали для меня: -
loginButton.callOnClick();
Intent startedIntent = shadowOf(activity).getNextStartedActivity();
ShadowIntent shadowIntent = shadowOf(startedIntent);
assertEquals(NextActivity.class, shadowIntent.getIntentClass());
Ответ 4
Вдохновленный ответом @MichK, вот полный тестовый тест с использованием цепочки методов buildActivity
от Robolectric 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)));
}
Ответ 5
@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));
}
Ответ 6
Вот как это выглядит для Robolectric 3
// 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));
Ответ 7
Джеймс Невилл ответ работает на 4.3. Однако я использовал API AndroidX, 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)
}
}
Ответ 8
Не использовав ни одного из модульных тестов в android, я не уверен, что это будет работать:
В действии, которое вы запускаете, вы можете создать статическую переменную с именем "instance".
private static TheActivitysName instance;
В действии onCreate вы задаете переменную экземпляра:
instance = this;
И затем вы создаете статический метод для получения этой переменной.
public static TheActivitysName getInstance() {
return instance;
}
В своем тесте вы можете проверить на TheActivitysName.getInstance().
Если он равен нулю, активность не запускается. Если он отличается от нуля, то действие было создано.
Я не уверен, будет ли проверяться код, прежде чем будет создано время для создания.