Roboletric v4.2 Release Notes

Release Date: 2019-02-14 // about 5 years ago
  • ๐Ÿš€ This release introduces a new extension mechanism for Robolectric, fixes a major performance regression in 4.x, and includes numerous SDK support improvements and bug fixes.

    ๐Ÿ”‹ Features

    • ๐Ÿ‘€ Robolectric 4.2 introduces a new plugin system, replacing the previous ad-hoc customization mechanisms (subclassing RobolectricTestRunner, providing system properties, etc.). The old mechanisms are deprecated and will eventually be removed; let us know if there are missing extension points you need. See org.robolectric.pluginapi for more details [issue #4362].
    • ๐Ÿ›  Fixed a significant performance regression in 4.x. Thanks @cesar1000! [issues #4142, #4585].
    • For developers of custom shadows, Robolectric 4.2 has a new typesafe and more performant way to access fields and methods on @RealObjects using the Reflector API [issues #4361, #4315, #4351, #4456]

    โœ… Android SDK support and Test API changes

    • ๐Ÿ‘€ Activities must now be explicitly declared in a manifest (as is the case for normal Android). See #4736 for more context.
    • ๐Ÿ“ฆ PackageManager
      • PackageManager is moving to returning defensive immutable copies of its internal data (as on a real device). A series of new testing APIs have been added to modify the package under test; see PackageManager.addOrUpdateActivity() and removeActivity(), plus Service, ContentProvider, and BroadcastReceiver equivalents [issue #4489].
      • Implement PackageManager.isSafeMode() [issue #4526].
    • ShadowDisplayManager.getSaturationLevel() is now an instance method [issue #4522].
    • Telephony
      • Add slotId based getImei() and getMeid() to TelephonyManager [issue #4521].
      • Add the ability to prevent certain networks from being updated in tests [issue #4515].
      • Implement TelephonyManager.getListenersForFlags in tests [issue #4469].
      • Implement TelephonyManager.getVisualVoicemailPackageName() [issue #4444].
    • Bluetooth
      • Test APIs for BluetoothSocket and BluetoothServerSocket connections [issue #4510].
      • Implement BluetoothLeAdvertiser [issues #4478 and #4454].
      • Implement BluetoothHeadset.getConnectedDevices(), getConnectionState(), and sendVendorSpecificResultCode(), with test APIs [issue #4442].
      • Add ability to send BluetoothGattCallback connection state change updates [issue #4584].
    • Implement ActivityManager#getCurrentUser() [issue #4483].
    • UserManager
      • Implement UserManager.getUserSerialNumber() [issue #4501].
      • UserManager#addUser returns a UserHandle to the user it creates [issue #4449].
      • Add isRestrictedProfile() and setIsRestrictedProfile() [issue #4554].
    • Implement Context.sendBroadcastAsUser [issue #4486].
    • ๐Ÿšš Implement WindowManagerImpl#removeViewImmediate(View) [issue #4447].
    • Implement SensorManager.registerListener(): [issue #4446].
    • Implement NetworkScoreManager.disableScoring() and isScoringEnabled() to [issue #4436].
    • DevicePolicyManager now enforces password restrictions [issues #4532, #4545, and #4539].
    • Implement UiModeManager [issue #4548].
    • Implement AccessibilityManager#addAccessibilityStateChangeListener(AccessibilityStateChangeListener, Handler) [issue #4448].
    • Implement ParcelFileDescriptor.createReliablePipe method [issue #4562].
    • ๐Ÿ“ฆ Move intent filters to their own lists and out of the Package [issue #4488].
    • Implement WifiRttManager and RangingResult [issue #4561].
    • โž• Add test API to toggle a Sensor wake-up mode [issue #4558].
    • โž• Add PowerManager.WakeLock getTimesHeld() test API to count number of times the wakelock was held [issue #4551].
    • โž• Adds basic MediaCodec and MediaMuxer shadows to robolectric. The MediaCodec shadow implements basic passthrough asynchronous encoding, and the MediaMuxer shadow muxes input bytes directly to the file without modification [issue #4550].
    • โšก๏ธ Update to ShadowDevicePolicyManager to allow uses-policy granting [issue #4546].
    • Modify ShadowParcel to throw an Error instead of RuntimeException to discourage [issue #4528].
    • Don't autocreate activities in LocalActivityInvoker anymore [issue #4582].
    • 0๏ธโƒฃ Don't automatically generate default ActivityInfo whenever asked [issue #4580].
    • ๐Ÿšš Implements WebView.removeJavascriptInterface [issue #4575].
    • โšก๏ธ Update to ShadowDevicePolicyManager to set storage encryption [issue #4563].

    ๐Ÿ”ง Configuration

    ๐Ÿ› Bug Fixes

    • The android system context is no longer a parent of the application context [issue #4481].
    • ๐Ÿ›  Fix LocalActivityInvoker.recreateActivity. Before this change, it called Activity.onRetainNonConfigurationInstance() directly to obtain nonConfigInstance for the activity. This should've called indirectly from Activity.retainNonConfigurationInstances(). retainNonConfigurationInstances() also creates nonConfigInstances for fragments to prepare for the host activity recreation [issue #4511].
    • ๐Ÿ›  Fix timeout in FontsContract.getFontSync() caused because Context.canLoadUnsafeResources() now returns false since the context isn't a system context [issue #4517].
    • ๐Ÿ›  Fix handling of persisted preferred activities [issue #4480].
    • ๐Ÿ›  Fix processName setting and add few more reasonable defaults when installing new package [issue #4465].
    • โž• Add permission check to LocationManager.setLocationEnabledForUser [issue #4500].
    • No longer reset the data position after unmarshalling a ShadowParcel [issue #4468].
    • ๐Ÿ›  Fix NPE Robolectric when a failure occurs before shadows are set up [issue #4467].
    • Set AppBindData#processName consistently with ApplicationInfo#processName [issue #4537].
    • ๐Ÿ“ฆ Throw NameNotFoundException from Context.createPackageContext for non-existing packages [issue #4527].
    • ๐Ÿ”€ Synchronize access to ShadowPendingIntent and ShadowUsageStatsManager fields [issue #4520].
    • ๐Ÿ›  Fix Activity#isChangingConfigurations() returning false during the recreation [issue #4540].
    • ๐Ÿ›  Fix equality in ShadowNetwork [issue #4464].

    ๐Ÿ—„ Deprecations and Removals

    • ๐Ÿšš FsFile et al. have been removed in favor of java.nio.file.Path [issue #4265].
    • โšก๏ธ ShadowPackageManager.addResolveInfoForIntent is deprecated; add explicit activity declarations in your manifest, or use ShadowPackageManager.addOrUpdateActivity(ActivityInfo) [issue #4489].
    • ๐Ÿ—„ Deprecate Robolectric#setupActivity in favor of ActivityScenario [issue #4564].

    Internal Changes

    • โœ… Tests are now run on a dedicated thread for each SDK [issue #4559].
    • ๐Ÿ”Œ Resolve AARs like the android plugins do (kind of) [issue #4279].
    • Reflector objects should unwrap invocation exceptions [issue #4361].
    • Fast private method invocation [issue #4315].
    • โž• Add support for static methods and fields to Reflector [issue #4351].
    • ๐Ÿ›  Fix Reflector class definition in Java 11 [issue #4456].
    • ๐Ÿ‘Œ Support Java 9 [issue #4400].
    • ๐Ÿ Robolectric now builds successfully on Windows, though a few tests still fail [issue #4293].
    • ๐Ÿ”ง Extensible configuration system [issue #4519].
    • Switch circleci to API 28 image. Fix SDK install license fail [issue #4541].
    • ๐Ÿ”„ Changes to support Java 9 [issue #4452].
    • TypedArray doesn't need a shadow in binary mode [issue #4470].
    • Extract Sdk from SdkConfig [issue #4394].
    • Clean up SdkProvider interface [issue #4513].
    • ๐Ÿšš Move PerfStatsReporter to pluginapi [issue #4471].
    • PerfStatsCollector retains min and max timing info for events [issue #4552].
    • โœ‚ Remove DefaultConfigMerger [issue #4549].

    Known Issues

    • ๐Ÿ‘€ Activities must now be explicitly declared in a manifest (as is the case for normal Android); however, Android Gradle Plugin doesn't currently merge a test manifest. See #4736 for more context and #4727 for a workaround.
    • ๐Ÿ Robolectric 4.2 doesn't work on Windows in some cases [issue #4603 et al.].
    • โœ… Android Gradle Plugin 3.2.1 and 3.3 report the following warning, which may be safely ignored: WARNING: The option setting 'android.enableUnitTestBinaryResources=true' is experimental and unsupported.. Android Gradle Plugin 3.4 will resolve this issue.
    • ๐Ÿ Android Gradle Plugin 3.2.1 does not work on Windows; use 3.3 instead [issue #3955].

    Compatibility

    • ๐Ÿ”Œ Android Studio/Android Gradle Plugin 3.3 or 3.4 Beta
    • โœ… Android SDK 28 (includes support for testing against SDKs from 16 on)

    ๐Ÿ‘‰ Use Robolectric:

    testCompile "org.robolectric:robolectric:4.2"
    

    Find more details here. Report issues here. Enjoy!