Как я могу проверить фрагменты с помощью Robolectric?


Я знаю, что есть Robolectric.shadowOf(Fragment) способ и ShadowFragment класс, думал, что они не перечислены в документах, но я не могу заставить его работать.

myFragment = new MyFragment();
myFragment.onCreateView(LayoutInflater.from(activity), (ViewGroup) activity.findViewById(R.id.container), null);
myFragment.onAttach(activity);
myFragment.onActivityCreated(null); 

Я работаю с API уровня 13 (Honeycomb).

спасибо.

6 55

6 ответов:

редактировать #4 & #5: в Robolectric 3.* , они разделили функции запуска фрагмента.

для поддержки фрагментов, вам нужно будет добавить зависимость на build.gradle:

testCompile "org.robolectric:shadows-supportv4:3.8"

импорт: org.robolectric.shadows.support.v4.SupportFragmentTestUtil.startFragment;

для фрагментов платформы вам не нужна эта зависимость. Импорт:import static org.robolectric.util.FragmentTestUtil.startFragment;

они оба используют одно и то же имя startFragment().

import static org.robolectric.shadows.support.v4.SupportFragmentTestUtil.startFragment;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class YourFragmentTest
{
    @Test
    public void shouldNotBeNull() throws Exception
    {
        YourFragment fragment = YourFragment.newInstance();
        startFragment( fragment );
        assertNotNull( fragment );
    }
}

Edit #3: Robolectric 2.4 имеет API для поддержки и регулярных фрагментов. Вы можете использовать newInstance() шаблон или использовать конструктор при построении Fragment ' s.

import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertNotNull;
import static org.robolectric.util.FragmentTestUtil.startFragment;

@RunWith(RobolectricGradleTestRunner.class)
public class YourFragmentTest
{
    @Test
    public void shouldNotBeNull() throws Exception
    {
        YourFragment fragment = new YourFragment();
        startFragment( fragment );
        assertNotNull( fragment );
    }
}

Edit #2: есть новый помощник, если вы используете фрагменты поддержки (тот, который поддерживает регулярные действия / фрагменты должны быть в следующем отпустите):

import static org.robolectric.util.FragmentTestUtil.startFragment;

@Before
public void setUp() throws Exception
{
    fragment = YourFragment.newInstance();
    startFragment( fragment );
}

Edit: при обновлении до Robolectric 2.0:

public static void startFragment( Fragment fragment )
{
    FragmentActivity activity = Robolectric.buildActivity( FragmentActivity.class )
                                           .create()
                                           .start()
                                           .resume()
                                           .get();

    FragmentManager fragmentManager = activity.getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add( fragment, null );
    fragmentTransaction.commit();
}

оригинальный ответ

как предложил другой комментатор, вам нужно использовать диспетчер фрагментов (вместо вызова методов жизненного цикла, перечисленных выше).

@RunWith(MyTestRunner.class)
public class YourFragmentTest
{
    @Test
    public void shouldNotBeNull() throws Exception
    {
        YourFragment yourFragment = new YourFragment();
        startFragment( yourFragment );
        assertNotNull( yourFragment );
    }

Я создаю тестовый бегун и имею функцию, которая запускает фрагмент для меня, чтобы я мог использовать его везде.

public class MyTestRunner extends RobolectricTestRunner
{
    public MyTestRunner( Class<?> testClass ) throws InitializationError
    {
        super( testClass );
    }

    public static void startFragment( Fragment fragment )
    {
        FragmentManager fragmentManager = new FragmentActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add( fragment, null );
        fragmentTransaction.commit();
    }
}

вы, ребята, все делаете это трудный путь. Просто используйте FragmentTestUtil.

FragmentTestUtil.startFragment(yourfragment);

фрагменты поддержки были перемещены в модуль:

тени-поддержка-v4

(по состоянию на июль 2015 года,Robolectric v3.0)

добавьте зависимость gradle в приложение / сборку.Gradle в:

testCompile 'org.robolectric:shadows-support-v4:3.0'

затем импортируйте в свой класс Java Robolectric test:

import org.robolectric.shadows.support.v4.SupportFragmentTestUtil;

затем вы можете запустить и использовать фрагмент support-v4 для тестирования:

@Test
public void minimalFragmentTest() throws Exception {
    MyFunFragment fragment = new MyFunFragment();
    SupportFragmentTestUtil.startVisibleFragment(fragment);
    assertThat(fragment.getView()).isNotNull();
}

ссылки:

Я уверен, что вы должны создать FragmentTransaction с помощью FragmentManager, то он будет работать.

Я просто хотел добавить, что в Robolectric 2.0 даже после этого:

activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragment.show(activity.getSupportFragmentManager(), null);
fragment.getDialog();  //This stills returns null

Он по-прежнему возвращал null для меня. то, что я сделал, было добавить activity.getSupportFragmentManager().executePendingTransaction(); и это сработало.

кажется, robolectric не запускает это по какой-то причине. кажется, что, возможно, петлитель приостановлен или что-то в этом роде. в любом случае это сработало для меня, и это выглядит так:

activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragment.show(activity.getSupportFragmentManager(), null);
activity.getSupportFragmentManager().executePendingTransactions();
fragment.getDialog();
SupportFragmentTestUtil.startFragment(fragment, AppCompatActivity::class.java)

если активность расширяется AppCompatActivity

это с помощью Kotlin