58

我知道有一个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)。

谢谢。

4

7 回答 7

113

编辑 #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 );
    }
}

编辑#3:Robolectric 2.4 有一个用于支持和常规片段的 API。在构建's时,您可以使用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();
    }
}
于 2012-10-15T20:14:42.717 回答
36

你们都在艰难地做这件事。只需使用 FragmentTestUtil。

FragmentTestUtil.startFragment(yourfragment);
于 2014-01-22T21:28:41.513 回答
15

支持片段已移至模块:

阴影支持-v4

(截至 2015 年 7 月,Robolectric v3.0)

向 app/build.gradle 添加 gradle 依赖项:

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

然后导入您的 Robolectric 测试 java 类:

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();
}

参考:

于 2015-10-04T12:04:17.027 回答
2

我很确定您必须FragmentTransaction使用. 创建一个FragmentManager,然后它才能工作。

于 2012-07-20T17:12:53.083 回答
2

我只是想在 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 出于某种原因没有运行它。似乎 Looper 已暂停或其他什么。这对我有用的任何方式,它看起来像这样:

activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragment.show(activity.getSupportFragmentManager(), null);
activity.getSupportFragmentManager().executePendingTransactions();
fragment.getDialog();
于 2013-09-05T18:55:05.980 回答
2

旧的 android 片段已经被弃用,似乎支持片段很快也会被弃用。要测试 androidx 片段,您可以使用带有 robolectric 的片段场景https://developer.android.com/training/basics/fragments/testing

testImplementation 'androidx.fragment:fragment-testing:1.2.2'
val scenario = launchFragmentInContainer<MyFragment>()
scenario.onFragment { fragment ->
    assertNotNull(fragment.view.synteticInflatedView)
}
于 2020-02-28T07:23:22.697 回答
1
SupportFragmentTestUtil.startFragment(fragment, AppCompatActivity::class.java)

如果活动延长AppCompatActivity

这是使用 Kotlin

于 2018-04-28T09:54:25.023 回答