web-dev-qa-db-ja.com

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)で作業しています。

ありがとう。

56
kaneda

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

Edit#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();
    }
}
_
109
colabug

皆さんはこれを大変な方法でやっています。 FragmentTestUtilを使用するだけです。

FragmentTestUtil.startFragment(yourfragment);
36
Brian Griffey

サポートフラグメントはモジュールに移動されました。

shadows-support-v4

(2015年7月現在、Robolectric v3.0)

Gradle依存関係をapp/build.gradleに追加します。

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

次に、RobolectricテストにインポートしますJava class:

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

参照:

  • github changelog 、サポートフラグメントを別のモジュールに移動する
13
Baker

FragmentTransactionを使用してFragmentManagerを作成する必要があると確信しています。

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();
_
2
superjugy
SupportFragmentTestUtil.startFragment(fragment, AppCompatActivity::class.Java)

アクティビティがAppCompatActivityを拡張している場合

これはKotlinを使用しています

1
prijupaul