Android-如何测试是否加载了正确的片段?

Android-如何测试是否加载了正确的片段?,android,unit-testing,android-fragments,android-activity,Android,Unit Testing,Android Fragments,Android Activity,我最近开始使用AndroidStudio 3.1.2和SDK 19编写我的第一个android项目 目前,我正在为我的no-UI对象编写测试,并希望测试oncreate()方法中加载的活动片段。活动本身检查调用自身的意图,并根据意图内的标志加载不同的片段。活动布局仅包含名为fragment\u container的框架布局 喷溅活动: public class SplashActivity extends AppCompatActivity { @Override protec

我最近开始使用AndroidStudio 3.1.2和SDK 19编写我的第一个android项目

目前,我正在为我的no-UI对象编写测试,并希望测试
oncreate()
方法中加载的活动片段。活动本身检查调用自身的意图,并根据意图内的标志加载不同的片段。活动布局仅包含名为
fragment\u container
的框架布局

喷溅活动:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        if (!(getIntent().getBooleanExtra("isLaunch", true))) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new LoginFragment()).commit();
        } else {
            if (savedInstanceState == null) {
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SplashFragment()).commit();
            }
        }
    }
}
事实上,这就是目前所有Splash活动的代码。 现在我的问题是,如果有任何方法来检查,哪一个碎片被加载了?可能是
getSupportFragmentManager()。getFragmentByTag()
?谢谢转发

编辑:

根据@rxabin建议的解决方案,我在测试方法中添加了一个
instanceof
检查

飞溅活性测试:

@RunWith(AndroidJUnit4.class)
public class SplashActivityTest {

    private final SplashActivity testActivity = new SplashActivity();
    private final Intent testIntent = new Intent();

    @Test
    public void canLoadSplashFragment() {
        testActivity.recreate();
        Fragment fragment = testActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        assertTrue(fragment instanceof SplashFragment);
    }

    @Test
    public void canLoadLoginFragment() {
        testIntent.putExtra("isLaunch", false);
        testActivity.recreate();
        Fragment fragment = testActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        assertTrue(fragment instanceof LoginFragment);
    }

}

当我尝试运行此测试时,我得到一个运行时异常:
无法在未调用Looper.prepare()的线程内创建处理程序。
引用我定义
测试活动性的行。你知道我必须如何实例化一个活动吗?这样我就可以调用
testActivity.recreate()

你应该使用
FragmentManager
findFragmentById()
方法,然后你可以使用
instanceof
检查它是哪个片段

您的代码应该如下所示:

mFragmentManager = getSupportFragmentManager();    
Fragment frag = mFragmentManager.findFragmentById(R.id.fragment_container);
if (frag instanceof LoginFragment) {
   // It's a LoginFragment
} else {
    // It's something else!
}

你可以使用SharedReferences如果你只是调试,你可以使用Toast这对我没有多大帮助,尽管我不明白,toasts或SharedReferences如何帮助我识别片段,这将取代
fragment\u container
…你应该遵循Google的建议,将侦听器添加到附加的片段中。这样,您就可以知道哪个片段附加到活动。你有没有注意到,我总是创建一个新的匿名片段?那么这个解决方案也会起作用吗?@Procra by anonymous你的意思是该片段可能属于任何类别?通过使用findFragmentById(),您将获得加载到容器中的片段,然后您可以检查您的片段是否“正确”。@Proca这肯定是线程问题。您无法从工作线程创建活动,因此会出现该错误。尝试使用ActivityTestRule()。希望这能解决你的问题