Как я могу проверить фрагменты с помощью 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 ответов:
редактировать #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();