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

时间:2018-10-18 12:43:43

标签: android unit-testing android-fragments android-activity

我最近开始使用Android Studio 3.1.2和SDK 19编码我的第一个android项目。

当前,我正在为我的无UI对象编写测试,并希望进行测试,该测试将片段加载到oncreate()方法中。活动本身会检查调用自身的Intent,并根据Intent中的标志加载不同的Fragment。活动布局仅包含一个名为fragment_container的FrameLayout。

SplashActivity:

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

实际上,这就是目前SplashActivity的所有代码。 现在我的问题是,是否有任何方法可以检查哪个片段已加载?可能getSupportFragmentManager().getFragmentByTag()?谢谢。

编辑:

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

SplashActivityTest:

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

}

当我尝试运行此测试时,出现RuntimeException:Can't create handler inside thread that has not called Looper.prepare()指向定义testActivity的行。知道如何实例化一个活动,以便可以在其上调用testActivity.recreate()吗?

1 个答案:

答案 0 :(得分:1)

您应该使用FragmentManager的{​​{1}}方法,然后可以使用findFragmentById()检查它是哪个片段。

您的代码应如下所示:

instanceof