Java Android片段的测试仅在第一次执行时通过

Java Android片段的测试仅在第一次执行时通过,java,unit-testing,android-fragments,Java,Unit Testing,Android Fragments,我正在为调用片段的活动编写单元测试。这是我的密码: @RunWith(AndroidJUnit4.class) public class ContentDetailsActivityTest { private ContentDetailsActivity mContentDetailsActivity; @Rule public ActivityTestRule<ContentDetailsActivity> mActivityRule = new Ac

我正在为调用
片段的
活动
编写单元测试。这是我的密码:

@RunWith(AndroidJUnit4.class)
public class ContentDetailsActivityTest {

    private ContentDetailsActivity mContentDetailsActivity;

    @Rule
    public ActivityTestRule<ContentDetailsActivity> mActivityRule = new ActivityTestRule<>
            (ContentDetailsActivity.class);

    @Before
    public void setUp() throws Exception {
        mContentDetailsActivity = mActivityRule.getActivity();
    }

    @After
    public void tearDown() throws Exception {
        mContentDetailsActivity = null;
    }

    @Test
    public void onCreate() throws Exception {
        ContentDetailsFragment mFragment = (ContentDetailsFragment) mContentDetailsActivity
                .getFragmentManager().findFragmentById(R.id.content_details_fragment);

        assertTrue(mFragment.isVisible());
    }

    @Test
    public void onActionListUpdateRequired() throws Exception {
        // [irrelevant]
    }

    @Test
    public void onStart() throws Exception {
        // [irrelevant]
    }

    @Test
    public void onStop() throws Exception {
        // [irrelevant]
    }
}
@RunWith(AndroidJUnit4.class)
公共类ContentDetailsActivityTest{
私有ContentDetailsActivity mContentDetailsActivity;
@统治
公共活动测试规则mActivityRule=新活动测试规则
(ContentDetailsActivity.class);
@以前
public void setUp()引发异常{
mContentDetailsActivity=mActivityRule.getActivity();
}
@之后
public void tearDown()引发异常{
mContentDetailsActivity=null;
}
@试验
public void onCreate()引发异常{
ContentDetailsFragment MFFragment=(ContentDetailsFragment)mContentDetailsActivity
.getFragmentManager().findFragmentById(R.id.content\u details\u fragment);
assertTrue(MFFragment.isVisible());
}
@试验
ActionListUpdateRequired()引发异常{
//[无关]
}
@试验
public void onStart()引发异常{
//[无关]
}
@试验
public void onStop()引发异常{
//[无关]
}
}
以下是XML布局:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:name="com.amazon.android.tv.tenfoot.ui.fragments.ContentDetailsFragment"
          android:id="@+id/content_details_fragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
        />

单独运行时,每个测试都通过。但是,当测试一起运行时,
onCreate()
由于
片段
为空而失败。我可以通过命名测试来解决这个问题,以便首先调用
onCreate()
,但我认为这是一种不好的做法,因为单元测试应该彼此独立

根据我的研究,这是因为在每次测试开始时没有正确地重新创建
活动。我在我的
setUp()
方法中添加了
mContentDetailsActivity.recreate()
,并在每个方法中添加了
@UiThreadTest
注释;虽然这解决了
onCreate()
问题,但有一半的其他测试失败,在成功和失败之间交替进行

有人知道解决办法吗


编辑:添加了XML布局。

您可以发布活动的XML布局吗?当然,我刚刚添加了它。测试通常按什么顺序运行?你能给我看一下其他的测试吗?(我理解您为什么没有将它们包括在原始问题中,但由于测试的顺序似乎会导致问题,我有兴趣了解其他测试会做些什么,以便获得有关问题原因的一些线索,并希望找到解决办法。)也许再做一个测试就足够了。它们按照
onActionListUpdateRequired()
onStart()
onStop()
onCreate()的顺序运行。其他三个测试实际上是空白的,还没有做任何事情。如果只向每个测试方法添加
@UiThreadTest
,而不添加
mContentDetailsActivity.recreate()
,会发生什么?(很抱歉问了这么多问题。我只是想帮你诊断发生了什么。)你能发布活动的XML布局吗?当然,我刚刚添加了它。测试通常按什么顺序运行?你能给我看一下其他的测试吗?(我理解您为什么没有将它们包括在原始问题中,但由于测试的顺序似乎会导致问题,我有兴趣了解其他测试会做些什么,以便获得有关问题原因的一些线索,并希望找到解决办法。)也许再做一个测试就足够了。它们按照
onActionListUpdateRequired()
onStart()
onStop()
onCreate()的顺序运行。其他三个测试实际上是空白的,还没有做任何事情。如果只向每个测试方法添加
@UiThreadTest
,而不添加
mContentDetailsActivity.recreate()
,会发生什么?(很抱歉问了这么多问题。我只是想帮你诊断发生了什么。)