当我添加片段自定义转换时,单元测试NPE

时间:2015-11-07 00:22:38

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

当我添加自定义转换时,

OnBackPressed()测试会抛出NPE。没有自定义转换,它没问题。为什么呢?

此NPE仅在单位测试中发生,而不是应用程序。

 class MyActivity {
    @Override
    public void onBackPressed() {
        .......
        super.onBackPressed();
    }

    private void putFragment(Fragment fragment) {
            String tag = fragment.getClass().getName();

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // TEST FAILED IF I ADD THE FOLLOWING LINE
            transaction.setCustomAnimations(
                    R.anim.slide_in_left_fade_in,
                    R.anim.fade_out_short_anim_time,
                    R.anim.fade_in_short_anim_time,
                    R.anim.slide_out_right_fade_out);

            transaction.replace(R.id.ub__add_profiles_content, fragment, tag);
            transaction.addToBackStack(tag);
            transaction.commit();
    }
}

class MyActivityTest extends RiderRobolectricBase {

    @Test
    public void onBackPressed() {
       putFragment(someFragment);

       mMyActivity.onBackPressed();
    }
}

例外:

java.lang.NullPointerException
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
    at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1304)
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:909)
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1625)
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:561)
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
    at MyActivity.onBackPressed(MyActivity.java:28)

2 个答案:

答案 0 :(得分:1)

Onbackpress您正在从Backstack中撤消之前的步骤。首先是 删除现有的片段。片段与活动分离并且 你没有保留这个片段的实例。

java.lang.NullPointerException
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
    at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1304)
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:909)
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1625)
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:561)
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
    at MyActivity.onBackPressed(MyActivity.java:28)

您致电putFragment(someFragment) 所以当你去调用setCustomAnimations时。之前的视图不会保存以用于过渡。

// TEST FAILED IF I ADD THE FOLLOWING LINE
transaction.setCustomAnimations(
    R.anim.slide_in_left_fade_in,
    R.anim.fade_out_short_anim_time,
    R.anim.fade_in_short_anim_time,
    R.anim.slide_out_right_fade_out);

您可以在片段的oncreate方法中保留实例:

setRetainInstance(true);

至于您在应用中使用此功能,我无法在您的活动的onBackPressed事件中看到代码。

答案 1 :(得分:0)

代码似乎是正确的。我怀疑由于addToBackStack()来电,您使用replace()后无法致电setCustomAnimations。因此,要进行快速测试,只需删除对addToBackStack的调用。

通常你可以在replace()之后调用addToBackStack()。我做了很多次。

让我知道你的结果......