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 (ハニカム) を使用しています。

ありがとう。

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 と通常のフラグメントがあります。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 に答える
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 がこれを実行していないようです。ルーパーが一時停止しているかのようです。これは私にとってはうまくいきましたが、次のようになります。

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 に答える