Ответ 1
Изменить # 4 и # 5. В Robolectric 3. * они разделили функции запуска фрагмента.
Для фрагментов поддержки вам нужно добавить зависимость к вашему build.gradle
:
testCompile "org.robolectric:shadows-support-v4:3.3.2"
Импорт: 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 );
}
}
Изменить # 3. Robolectric 2.4 имеет API для поддержки и регулярных фрагментов. Вы можете использовать шаблон newInstance()
или использовать конструктор при построении Fragment
.
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 );
}
}
Изменить # 2. Там новый помощник, если вы используете фрагменты поддержки (тот, который поддерживает регулярные действия/фрагменты, должен быть в следующем выпуске):
import static org.robolectric.util.FragmentTestUtil.startFragment;
@Before
public void setUp() throws Exception
{
fragment = YourFragment.newInstance();
startFragment( fragment );
}
Изменить. Если вы обновили до 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();
}
}