Единичные тесты NPE, когда я добавляю пользовательские переходы фрагментов

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) 

Solutions Collecting From Web of "Единичные тесты NPE, когда я добавляю пользовательские переходы фрагментов"

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 вашей деятельности.

Код кажется правильным. Я подозреваю, что вы не можете вызвать addToBackStack() после использования replace() из-за вызова setCustomAnimations . Поэтому для быстрого теста просто удалите вызов addToBackStack .

Обычно вы можете вызвать addToBackStack () после replace (). Я делаю это много раз.

Дайте мне знать о ваших результатах …