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および#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();
}
}
_
皆さんはこれを大変な方法でやっています。 FragmentTestUtilを使用するだけです。
FragmentTestUtil.startFragment(yourfragment);
サポートフラグメントはモジュールに移動されました。
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();
}
参照:
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();
_
SupportFragmentTestUtil.startFragment(fragment, AppCompatActivity::class.Java)
アクティビティがAppCompatActivity
を拡張している場合
これはKotlinを使用しています