Может ли Robolectric утверждать, что вкладки загружают ожидаемые действия? - PullRequest
3 голосов
/ 02 марта 2012

У меня есть действие, у которого есть 2 вкладки, каждая из которых указывает на действие, поэтому у меня их всего 3.

LoggedInActivity> MyProfile ИЛИ MyBadges

public class LoggedIn extends TabActivity
{

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); 

    Resources res = getResources(); // Resource object to get Drawables
    TabHost tabHost = getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(this, MyProfile.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("artists").setIndicator("My Profile",
            res.getDrawable(R.drawable.ic_tab_artists))
            .setContent(intent);
    tabHost.addTab(spec);

    // Do the same for the other tabs
    intent = new Intent().setClass(this, MyBadges.class);
    spec = tabHost.newTabSpec("albums").setIndicator("My Badges",
            res.getDrawable(R.drawable.ic_tab_artists))
            .setContent(intent);
    tabHost.addTab(spec);

    tabHost.setCurrentTab(0);
}

}

У меня вопрос: как настроить некоторые тесты Robolectric, чтобы утверждать, что при нажатии на ярлык вкладки отображается правильная активность вкладок?

В предыдущей операции с утверждениями активности ямы сделали что-то вроде этого:

@Test
public void assertClickingMyProfileLoadsTheMyProfileActivity()
{

    loginButton.performClick();

    ShadowActivity shadowActivity = shadowOf(searchActivity);

    Intent startedIntent = shadowActivity.getNextStartedActivity();
    ShadowIntent shadowIntent = shadowOf(startedIntent);

    // Check the correct intent was initiated
    assertThat(shadowIntent.getComponent().getClassName(), equalTo(LoggedInActivity.class.getName()));

}

Но я не могу найти справку / подсказки / учебные пособия о том, как тестировать вкладки в Robolectric, даже JavaDocs кажется немного разреженным

Любая помощь будет принята с благодарностью

РЕДАКТИРОВАТЬ 1: После указания более подходящего класса в API я до сих пор придумал:

@Test
    public void assertClickingMyProfileLoadsTheMyProfileActivity()
    {

        ShadowActivity shadowActivity = shadowOf(loggedInActivity);

        ShadowTabHost shadowTabHost = shadowOf(loggedInActivity.getTabHost());
        shadowTabHost.setCurrentTab(1);

        Intent startedIntent = shadowActivity.getNextStartedActivity();
        ShadowIntent shadowIntent = shadowOf(startedIntent);


        // Check the correct intent was initiated
        assertThat(shadowIntent.getComponent().getClassName(), equalTo(MyProfile.class.getName()));

    }

При следующей ошибке:

java.lang.NullPointerException: can't get a shadow for null
    at com.xtremelabs.robolectric.bytecode.ShadowWrangler.shadowOf(ShadowWrangler.java:249)
    at com.xtremelabs.robolectric.Robolectric.shadowOf_(Robolectric.java:773)
    at com.xtremelabs.robolectric.Robolectric.shadowOf(Robolectric.java:500)
    at com.mypackage.apps.activity.LoggedInTest.assertClickingMyProfileLoadsTheMyProfileActivity(LoggedInTest.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)

Не понимаю, как проверить вкладки?

...