[英]NullPointerException on fragment commit when running in Robolectric
這是我得到的例外:
Caused by: java.lang.NullPointerException
at android.view.WindowId.equals(WindowId.java:168)
at android.transition.Transition.pause(Transition.java:1669)
at android.transition.TransitionSet.pause(TransitionSet.java:483)
at android.transition.TransitionManager.sceneChangeSetup(TransitionManager.java:311)
at android.transition.TransitionManager.beginDelayedTransition(TransitionManager.java:415)
at android.support.v4.app.FragmentTransitionCompat21.beginDelayedTransition(FragmentTransitionCompat21.java:67)
at android.support.v4.app.BackStackRecord.configureTransitions(BackStackRecord.java:1257)
at android.support.v4.app.BackStackRecord.beginTransition(BackStackRecord.java:1077)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:678)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1671)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:532)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:130)
at org.robolectric.shadows.ShadowMessageQueue.access$100(ShadowMessageQueue.java:30)
at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:95)
at org.robolectric.util.Scheduler.runOrQueueRunnable(Scheduler.java:230)
at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:85)
at org.robolectric.shadows.ShadowMessageQueue.enqueueMessage(ShadowMessageQueue.java:116)
at android.os.MessageQueue.enqueueMessage(MessageQueue.java)
at android.os.Handler.enqueueMessage(Handler.java:631)
at android.os.Handler.sendMessageAtTime(Handler.java:600)
at android.os.Handler.sendMessageDelayed(Handler.java:570)
at android.os.Handler.post(Handler.java:326)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1557)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:654)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:621)
正如您所看到的, android.view.WindowId
類中發生異常,所以我懷疑這是我的代碼中的錯誤。 這是我正在運行的代碼:
if (AndroidHelper.isLollipopAndAbove()) {
Fade fadeIn = new Fade(Fade.IN);
Fade fadeOut = new Fade(Fade.OUT);
fadeIn.setDuration(200);
fadeOut.setDuration(200);
fragment.setEnterTransition(fadeIn);
fragment.setExitTransition(fadeOut);
}
FragmentTransaction fragmentTransaction = getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment);
if (keepInStack) {
fragmentTransaction.addToBackStack(null);
}
fragmentTransaction.commit();
如果我取出fragment.setEnterTransition(fadeIn);
這可以正常工作fragment.setEnterTransition(fadeIn);
和fragment.setExitTransition(fadeOut);
有什么方法可以解決這個問題嗎? 在真實設備上運行時沒有問題。
編輯 :只是為了超級清楚,這不是關於泛型NullPointerException
或我的片段為null或類似的問題。 此問題與在Robolectric環境中運行轉換代碼有關。 更具體地說,導致此問題的是setExitTransition
,問題似乎只在Robolectric
。 setEnterTransition
似乎工作正常
無論你實際使用什么測試框架, Robolectric
, Espresso
, Appium
- 請。 不要將動畫用於測試目的。
我很確定你的問題與此非常相似: https : //github.com/robolectric/robolectric/issues/1889但在這種情況下,動畫讓Robolectric
無休止地運行。
制作一個沒有轉換,插值器,動畫師等的MockFragment
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.