ANDROID – Unit test with Bundle not working

  Kiến thức lập trình

I’m having problems trying to creat Unit Tests that uses Bundle.
I’m pretty sure the problems are related with the fact that I’m trying to Unit Test an object that is from the Android framework (Bundle).

I created two scenarios, one using a HashMap and another using a Bundle to see if the problem was not on the logic of my test case, and it’s not.

import android.os.Bundle
import androidx.core.os.bundleOf
import io.mockk.MockKAnnotations
import io.mockk.impl.annotations.InjectMockKs
import io.mockk.impl.annotations.RelaxedMockK
import io.mockk.justRun
import io.mockk.slot
import io.mockk.verify
import org.junit.Before
import org.junit.Test
import kotlin.test.assertEquals

// Use case with HashMap

class SomeAnalytics(private val analytics: Analytics) {

    fun map(name: String) {
        analytics.track(hashMapOf("NAME" to name)
        )
    }
}

class Analytics {
    fun track(map: HashMap<String, String>) {}
}

class SomeAnalyticsTest {

    @RelaxedMockK
    private lateinit var analytics: Analytics

    @InjectMockKs
    private lateinit var someAnalytics: SomeAnalytics

    @Before
    fun setup() {
        MockKAnnotations.init(this)
    }

    @Test
    fun test() {
        val mapSlot = slot<HashMap<String, String>>()
        justRun { analytics.track(capture(mapSlot)) }

        someAnalytics.map("name")

        verify { analytics.track(mapSlot.captured) }
        assertEquals("name", mapSlot.captured["NAME"])
    }
}

// Use case with Bundle

class SomeAnalyticsBundle(private val analytics: AnalyticsBundle) {

    fun map(name: String) {
        analytics.track(bundleOf("NAME" to name))
    }
}

class AnalyticsBundle {
    fun track(map: Bundle) {}
}

class SomeAnalyticsBundleTest {

    @RelaxedMockK
    private lateinit var analytics: AnalyticsBundle

    @InjectMockKs
    private lateinit var someAnalytics: SomeAnalyticsBundle

    @Before
    fun setup() {
        MockKAnnotations.init(this)
    }

    @Test
    fun test() {
        val mapSlot = slot<Bundle>()
        justRun { analytics.track(capture(mapSlot)) }

        someAnalytics.map("name")

        verify { analytics.track(mapSlot.captured) }
        assertEquals("name", mapSlot.captured.getString("NAME"))
    }
}

The verify { analytics.track(mapSlot.captured) } passes, but the assertEquals("name", mapSlot.captured.getString("NAME")) does not and it outputs this message:


Expected :name
Actual   :null
<Click to see difference>

java.lang.AssertionError: expected:<name> but was:<null>
    at org.junit.Assert.fail(Assert.java:89)
    at org.junit.Assert.failNotEquals(Assert.java:835)
    at org.junit.Assert.assertEquals(Assert.java:120)
    at kotlin.test.junit.JUnitAsserter.assertEquals(JUnitSupport.kt:32)
    at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
    at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
    at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
    at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
    at br.com.carrefour.cartaocarrefour.parcele.ui.viewmodel.SomeAnalyticsBundleTest.test(TesteBundle.kt:86)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    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(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    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.proxy2/jdk.proxy2.$Proxy5.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)

Any ideas how I can fix my code?

Theme wordpress giá rẻ Theme wordpress giá rẻ Thiết kế website

LEAVE A COMMENT