Junit 在Robolectric中测试时,片段getView返回null

Junit 在Robolectric中测试时,片段getView返回null,junit,android-fragments,null,fragment,robolectric,Junit,Android Fragments,Null,Fragment,Robolectric,1.我想使用robolectric框架测试这些片段。我使用的是android-support-v4.jar。未调用NewFragment类中的onCreateView()方法 =========================================================== @RunWith(RobolectricTestRunner.class) public class NewFragmentTest extends Fragment{ private NewFragme

1.我想使用robolectric框架测试这些片段。我使用的是android-support-v4.jar。未调用NewFragment类中的onCreateView()方法

===========================================================

@RunWith(RobolectricTestRunner.class)
public class NewFragmentTest extends Fragment{
private NewFragment newFragment;


public void startFragment(Fragment fragment) {

            FragmentActivity  activity=Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
     FragmentManager fragmentManager = activity
     .getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

     fragmentTransaction.replace(R.id.content_frame,fragment,
     "new fragment");

    //fragmentTransaction.add(fragment, "");
    // fragmentTransaction.commit();
}

@Before
public void setUp() throws Exception {
    newFragment = new NewFragment();
    newFragment.onCreate(null);
    startFragment(newFragment);
}

@Test
public void testFragmentNotNull() {
    Assert.assertNotNull(newFragment);
}

@Test
public void shouldHaveButton() throws Exception {
    TextView textview = (TextView) getView().findViewById(R.id.id_txt);

    assertThat(textview.getVisibility(), equalTo(View.VISIBLE));

}
}


有三件事很突出:

  • 您的测试用例不应该扩展片段。那没有任何意义
  • 假设FragmentActivity在启动时不包含片段,您应该在startFragment()中提交片段事务
  • 您不需要自己对片段调用onCreate
  • 希望这会有所帮助。

    您的getView()返回null,因为片段尚未添加。请参阅Robolectric的代码

    方法
    startFragment()
    如下所示:

      public static void startFragment(Fragment fragment) {
        buildFragmentManager(FragmentUtilActivity.class)
            .beginTransaction().add(fragment, null).commit();
      }
    
      private static class FragmentUtilActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          LinearLayout view = new LinearLayout(this);
          view.setId(1);
    
          setContentView(view);
        }
      }
    
    内部类FragmentUtialivity如下所示:

      public static void startFragment(Fragment fragment) {
        buildFragmentManager(FragmentUtilActivity.class)
            .beginTransaction().add(fragment, null).commit();
      }
    
      private static class FragmentUtilActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          LinearLayout view = new LinearLayout(this);
          view.setId(1);
    
          setContentView(view);
        }
      }
    
    这就是问题所在。开发人员给出了布局,ID为1。
    FragmentTransaction
    中的
    add(Fragment,String)
    -方法说明:

    使用0 containerWebID调用add(int、Fragment、String)

    因此,放置在
    startFragment(Fragment)
    中的片段被放置在ID 0中。那是不存在的

    解决方案:


    调用方法
    startVisibleFragment(Fragment)
    。代码看起来与
    startFramgent(Fragment)
    一样,但是将片段放在容器1中(这是FragmentUtilActivity的线性布局)。

    “您的测试用例应该扩展片段。这没有任何意义。”我想您的意思是不应该,它应该扩展什么?Deepa-您解决了这个问题吗?我很好奇发生了什么事,你是怎么解决的。