簡體   English   中英

在Robolectric中運行時片段提交的NullPointerException

[英]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似乎工作正常

無論你實際使用什么測試框架, RobolectricEspressoAppium - 請。 不要將動畫用於測試目的。

我很確定你的問題與此非常相似: https//github.com/robolectric/robolectric/issues/1889但在這種情況下,動畫讓Robolectric無休止地運行。

制作一個沒有轉換,插值器,動畫師等的MockFragment類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM