This is the exception I'm getting:
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)
As you can see the exception is happening in android.view.WindowId class, so I doubt it's an error in my code. This is the code I'm running:
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();
This works fine if I take out fragment.setEnterTransition(fadeIn); and fragment.setExitTransition(fadeOut);
Is there any way to work around this? No issue when running on a real device.
EDIT: just to be super clear, this is not an issue about a generic NullPointerException or my fragment being null or anything like that. This issue is something to do with running transition code inside Robolectric environment. To be even more specific, it's the setExitTransition that is causing this issue, and the issue seems to be only manifesting in Robolectric. setEnterTransition seems to be working just fine
 
    