1

I have written a unit test, based on Spek Framework, for one of my use cases. Following is the use case code:

class InsertRemoteWidgetUseCase(
private val remoteConfigProviderImplement: RemoteConfigProviderImplement, 
private val feedDataStore: FeedDataStoreImplement
) {

fun invoke(): ArrayList<FeedData> {
    if (remoteConfigProviderImplement.getHomeWidgetVisible()) {
        val cardData = CardData()
        cardData.url = remoteConfigProviderImplement.getHomeWidgetURL()

        val feedData = FeedData()
        feedData.type = CardType.REMOTE_CONFIG_WIDGET
        feedData.listData = arrayListOf(cardData)

        feedDataStore.insertRemoteWidgetCard(feedData)
    } else {
        feedDataStore.removeRemoteWidgetCard()
    }

    return feedDataStore.getData()
  }
}  

Here is the test case implementation:

class InsertRemoteWidgetUseCaseTest : Spek({

lateinit var mockRemoteConfigProviderImplement: RemoteConfigProviderImplement
lateinit var mockFeedDataStoreImplement: FeedDataStoreImplement

lateinit var instance: InsertRemoteWidgetUseCase

val feedComponentData1: FeedComponentData = mockk(relaxed = true)
val feedComponentData2: FeedComponentData = mockk(relaxed = true)

var remoteWidgetUrl = ""
var remoteWidgetVisible = false

val feedDataList1 = arrayListOf(
    FeedData(listItems = arrayListOf(
        CardItem(articleData = ArticleData(title = "A0"))
    )
    ),
    FeedData(listItems = arrayListOf(
        CardItem(articleData = ArticleData(title = "B0")),
        CardItem(articleData = ArticleData(title = "B1")),
        CardItem(articleData = ArticleData(title = "B2"))
    ))
)

val feedDataList2 = arrayListOf(FeedData())
val pagination1 = Pagination(current = 0, next = 1)
val pagination2 = Pagination(current = 1, next = 2)

beforeEachTest {
    every{feedComponentData1.pagination} returns pagination1
    every{feedComponentData1.feedList} returns feedDataList1

    every{feedComponentData2.pagination} returns pagination2
    every{feedComponentData2.feedList} returns feedDataList2

    mockRemoteConfigProviderImplement = mockk(relaxed = true)
    mockFeedDataStoreImplement = spyk(FeedDataStoreImplement())

    instance = spyk(InsertRemoteWidgetUseCase(mockRemoteConfigProviderImplement, mockFeedDataStoreImplement))
}

describe("invoke()") {
    context("getHomeWidgetVisible is true") {
        it("FeedData with CardType.REMOTE_CONFIG_WIDGET is inserted") {
            remoteWidgetUrl = "www.google.com"
            remoteWidgetVisible = true
            every { mockRemoteConfigProviderImplement.getHomeWidgetURL() } returns remoteWidgetUrl
            every { mockRemoteConfigProviderImplement.getHomeWidgetVisible() } returns remoteWidgetVisible

            mockFeedDataStoreImplement.update(feedComponentData1)
            mockFeedDataStoreImplement.update(feedComponentData2)

            val feedDataListBefore = mockFeedDataStoreImplement.getData()
            val feedDataListAfter = instance.invoke()

            assert(feedDataListAfter[0].type == CardType.REMOTE_CONFIG_WIDGET)
            assert(feedDataListBefore.size == feedDataListAfter.size + 1)
        }
    }

    context("getHomeWidgetVisible is false") {
        it("FeedData with CardType.REMOTE_CONFIG_WIDGET is removed") {
            remoteWidgetUrl = "www.google.com"
            remoteWidgetVisible = false
            every { mockRemoteConfigProviderImplement.getHomeWidgetURL() } returns remoteWidgetUrl
            every { mockRemoteConfigProviderImplement.getHomeWidgetVisible() } returns remoteWidgetVisible

            mockFeedDataStoreImplement.update(feedComponentData1)
            mockFeedDataStoreImplement.update(feedComponentData2)

            val feedData = FeedData()
            feedData.type = CardType.REMOTE_CONFIG_WIDGET
            mockFeedDataStoreImplement.insertRemoteWidgetCard(feedData)

            val feedDataListBefore = mockFeedDataStoreImplement.getData()
            val feedDataListAfter = instance.invoke()

            assert(feedDataListAfter[0].type != CardType.REMOTE_CONFIG_WIDGET)
            assert(feedDataListBefore[0].type == CardType.REMOTE_CONFIG_WIDGET)
            assert(feedDataListBefore.size == feedDataListAfter.size - 1)
        }
    }
}
})

The test cases in question runs successfully in local system. But with Bitrise, both of them fails with following:

java.lang.AssertionError: Assertion failed
at sg.com.sph.appbt.views.bnavigation.home.InsertRemoteWidgetUseCaseTest$1$2$1$1.invoke(InsertRemoteWidgetUseCaseTest.kt:74)
at sg.com.sph.appbt.views.bnavigation.home.InsertRemoteWidgetUseCaseTest$1$2$1$1.invoke(InsertRemoteWidgetUseCaseTest.kt:17)
at org.spekframework.spek2.runtime.scope.TestScopeImpl.execute(Scopes.kt:94)
at org.spekframework.spek2.runtime.Executor$execute$$inlined$executeSafely$lambda$1$1.invokeSuspend(Executor.kt:52)
at ???(Coroutine boundary.?(?)
at kotlinx.coroutines.DeferredCoroutine.await$suspendImpl(Builders.common.kt:99)
at org.spekframework.spek2.runtime.ExecutorsKt$doRunBlocking$1.invokeSuspend(executors.kt:8)
Caused by: java.lang.AssertionError: Assertion failed
at sg.com.sph.appbt.views.bnavigation.home.InsertRemoteWidgetUseCaseTest$1$2$1$1.invoke(InsertRemoteWidgetUseCaseTest.kt:74)
at sg.com.sph.appbt.views.bnavigation.home.InsertRemoteWidgetUseCaseTest$1$2$1$1.invoke(InsertRemoteWidgetUseCaseTest.kt:17)
at org.spekframework.spek2.runtime.scope.TestScopeImpl.execute(Scopes.kt:94)
at org.spekframework.spek2.runtime.Executor$execute$$inlined$executeSafely$lambda$1$1.invokeSuspend(Executor.kt:52)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:740)

Problem Statement

This executes well at local system without errors but fails with Bitrise on cloud.

  1. Is there any silver bullet solution for this local vs remote issue.
  2. Could this be due to different environment, if yes then which all components's versions should be checked.
Harsh Vardhan
  • 675
  • 1
  • 11
  • 24

0 Answers0