Use of robolectric's `shadowOf` causes a runtime error in androidTest module code

156 Views Asked by At

I'm not exactly sure what is relevant here in the error, but when trying to use shadowOf on either bluetooth manager or bluetooth adapter I get similar errors.

@RunWith(AndroidJUnit4::class)
class DefaultBluetoothDataSourceTest {

    @Test
    fun test_shadowBluetoothAdapter_v1()
    {
        val context : Context = ApplicationProvider.getApplicationContext()
        val manager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
        val adapter = manager.adapter
        val shadowBluetoothAdapter = shadowOf(adapter)
    }

    @Test
    fun test_shadowBluetoothAdapter_v2()
    {
        val shadowBluetoothAdapter = shadowOf(BluetoothAdapter.getDefaultAdapter())
    }

}
08-18 23:19:45.880 26582 26619 I TestRunner: started: test_shadowBluetoothAdapter_v1(com.xenetix.p2kmbs.bluetooth.DefaultBluetoothDataSourceTest)
08-18 23:19:45.903 26582 26619 W .bluetooth.test: Accessing hidden field Ljava/lang/invoke/MethodHandles$Lookup;->IMPL_LOOKUP:Ljava/lang/invoke/MethodHandles$Lookup; (blocked, reflection, denied)
08-18 23:19:45.903 26582 26619 E TestRunner: failed: test_shadowBluetoothAdapter_v1(com.xenetix.p2kmbs.bluetooth.DefaultBluetoothDataSourceTest)
08-18 23:19:45.903 26582 26619 E TestRunner: ----- begin exception -----
08-18 23:19:45.905 26582 26619 E TestRunner: java.lang.ExceptionInInitializerError
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.shadow.api.Shadow.extract(Shadow.java:25)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.Shadows.shadowOf(Shadows.java:1393)
08-18 23:19:45.905 26582 26619 E TestRunner:    at com.xenetix.p2kmbs.bluetooth.DefaultBluetoothDataSourceTest.test_shadowBluetoothAdapter_v1(DefaultBluetoothDataSourceTest.kt:41)
08-18 23:19:45.905 26582 26619 E TestRunner:    at java.lang.reflect.Method.invoke(Native Method)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
08-18 23:19:45.905 26582 26619 E TestRunner:    at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:162)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.Suite.runChild(Suite.java:128)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.Suite.runChild(Suite.java:27)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
08-18 23:19:45.905 26582 26619 E TestRunner:    at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:67)
08-18 23:19:45.905 26582 26619 E TestRunner:    at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
08-18 23:19:45.905 26582 26619 E TestRunner:    at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:446)
08-18 23:19:45.905 26582 26619 E TestRunner:    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2361)
08-18 23:19:45.905 26582 26619 E TestRunner: Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.shadow.api.Shadow.<clinit>(Shadow.java:15)
08-18 23:19:45.905 26582 26619 E TestRunner:    ... 36 more
08-18 23:19:45.905 26582 26619 E TestRunner: Caused by: java.lang.reflect.InvocationTargetException
08-18 23:19:45.905 26582 26619 E TestRunner:    at java.lang.reflect.Constructor.newInstance0(Native Method)
08-18 23:19:45.905 26582 26619 E TestRunner:    at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.shadow.api.Shadow.<clinit>(Shadow.java:13)
08-18 23:19:45.905 26582 26619 E TestRunner:    ... 36 more
08-18 23:19:45.905 26582 26619 E TestRunner: Caused by: java.lang.LinkageError: No field IMPL_LOOKUP in class Ljava/lang/invoke/MethodHandles$Lookup; (declaration of 'java.lang.invoke.MethodHandles$Lookup' appears in /apex/com.android.art/javalib/core-oj.jar)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.internal.bytecode.ProxyMaker.<clinit>(ProxyMaker.java:73)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.internal.bytecode.ShadowImpl.<init>(ShadowImpl.java:9)
08-18 23:19:45.905 26582 26619 E TestRunner:    ... 39 more
08-18 23:19:45.905 26582 26619 E TestRunner: Caused by: java.lang.NoSuchFieldException: No field IMPL_LOOKUP in class Ljava/lang/invoke/MethodHandles$Lookup; (declaration of 'java.lang.invoke.MethodHandles$Lookup' appears in /apex/com.android.art/javalib/core-oj.jar)
08-18 23:19:45.905 26582 26619 E TestRunner:    at java.lang.Class.getDeclaredField(Native Method)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.internal.bytecode.ProxyMaker.getTrustedLookup(ProxyMaker.java:87)
08-18 23:19:45.905 26582 26619 E TestRunner:    at org.robolectric.internal.bytecode.ProxyMaker.<clinit>(ProxyMaker.java:59)
08-18 23:19:45.905 26582 26619 E TestRunner:    ... 40 more
08-18 23:19:45.905 26582 26619 E TestRunner: ----- end exception -----
08-18 23:19:45.907 26582 26619 I TestRunner: finished: test_shadowBluetoothAdapter_v1(com.xenetix.p2kmbs.bluetooth.DefaultBluetoothDataSourceTest)

java.lang.ExceptionInInitializerError
at org.robolectric.shadow.api.Shadow.extract(Shadow.java:25)
at org.robolectric.Shadows.shadowOf(Shadows.java:1393)
at com.xenetix.p2kmbs.bluetooth.DefaultBluetoothDataSourceTest.test_shadowBluetoothAdapter_v1(DefaultBluetoothDataSourceTest.kt:41)
... 32 trimmed
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at org.robolectric.shadow.api.Shadow.<clinit>(Shadow.java:15)
... 36 more
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at org.robolectric.shadow.api.Shadow.<clinit>(Shadow.java:13)
... 36 more
Caused by: java.lang.LinkageError: No field IMPL_LOOKUP in class Ljava/lang/invoke/MethodHandles$Lookup; (declaration of 'java.lang.invoke.MethodHandles$Lookup' appears in /apex/com.android.art/javalib/core-oj.jar)
at org.robolectric.internal.bytecode.ProxyMaker.<clinit>(ProxyMaker.java:73)
at org.robolectric.internal.bytecode.ShadowImpl.<init>(ShadowImpl.java:9)
... 39 more
Caused by: java.lang.NoSuchFieldException: No field IMPL_LOOKUP in class Ljava/lang/invoke/MethodHandles$Lookup; (declaration of 'java.lang.invoke.MethodHandles$Lookup' appears in /apex/com.android.art/javalib/core-oj.jar)
at java.lang.Class.getDeclaredField(Native Method)
at org.robolectric.internal.bytecode.ProxyMaker.getTrustedLookup(ProxyMaker.java:87)
at org.robolectric.internal.bytecode.ProxyMaker.<clinit>(ProxyMaker.java:59)
... 40 more

I was using https://github.com/robolectric/robolectric/blob/master/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java as a reference to begin writing my own tests that rely on BluetoothAdapter / BluetoothManager / BluetoothDevice.

In gradle, I tried setting my target sdk / compile sdk to match the one in the robolectric repo (sdk 33).

0

There are 0 best solutions below