Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SDK bump to 14.0.0 causes unit test failures #490

Open
matthewbahr-clear opened this issue Nov 11, 2024 · 0 comments
Open

SDK bump to 14.0.0 causes unit test failures #490

matthewbahr-clear opened this issue Nov 11, 2024 · 0 comments

Comments

@matthewbahr-clear
Copy link

Steps to Reproduce the Problem

Bumped SDK from 13.4.1 to 14.0.0

Expected Behavior

Unit tests continue working

Actual Behavior

Null pointer exceptions start to be thrown from Unit Tests because of null application context.

java.lang.NullPointerException: Cannot invoke "android.content.Context.getPackageName()" because the return value of "android.content.Context.getApplicationContext()" is null

Unit tests broke
java.lang.NullPointerException: Cannot invoke "android.content.Context.getPackageName()" because the return value of "android.content.Context.getApplicationContext()" is null
	at androidx.core.app.NotificationManagerCompat.areNotificationsEnabled(NotificationManagerCompat.java:374)
	at com.clearme.clearapp.notifications.NotificationChannelManager.isChannelEnabled(NotificationChannelManager.kt:49)
	at com.clearme.clearapp.notifications.NotificationChannelManager.isChannelEnabled(NotificationChannelManager.kt:40)
	at com.clearme.clearapp.notifications.NotificationChannelManagerTest.update channel tracking via analytics(NotificationChannelManagerTest.kt:105)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:112)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:40)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:60)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:52)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at jdk.proxy1/jdk.proxy1.$Proxy2.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)

Instabug integration code

Make sure to remove your app token.

SDK Version

14.0.0

Android Version

N/A

Device Model

N/A

[Optional] Project That Reproduces the Issue


My main request here is to know which downstream dependencies you might have bumped to cause this issue. Our minimum SDK version is already 28 so the bump to 19 shouldn't have caused issues.

This is affecting unit tests that do not use Instabug at all.

Example failing code:

  @Test
  fun `update channel tracking via analytics`() {
    val analytics = mock<Analytics>()
    val notificationChannelManager =
      Mockito.spy(
        object : NotificationChannelManager(
          mock(),
          mock(),
          analytics,
        ) {
          override val channelId: String = "channel_id"
          override val analyticsTrackingProperty: String = "analytics_property"
        },
      )

    whenever(notificationChannelManager.isChannelEnabled()).doReturn(true)

    notificationChannelManager.updateChannelTracking()

    verify(analytics, times(1)).globalProperties(
      mapOf(notificationChannelManager.analyticsTrackingProperty to "true"),
      true,
    )
  }

Notably the call whenever(notificationChannelManager.isChannelEnabled()).doReturn(true) is using a spy to handle a mocked context not being able to return the actual value that would be resolved by isChannelEnabled()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant