首页 > 解决方案 > Kotlin 测试预期 SingletonMap 但为 LinkedHashMap

问题描述

我是 Kotlin 和 Java 的新手,所以请耐心等待,但我刚刚编写了一个 Kotlin 测试,如下所示:

package com.squareup.cash.transactiongraph.service.actions
import com.squareup.cash.transactiongraph.TransactionGraphTestingModule
import com.squareup.cash.transactiongraph.client.franklin.FakeFranklinClient
import com.squareup.cash.transactiongraph.dataloader.DataLoaderRegistryFactory
import com.squareup.cash.transactiongraph.graphql.GraphQLContextFactory
import com.squareup.cash.transactiongraph.graphql.TransactionGraphContextFactory
import com.squareup.cash.transactiongraph.service.TransactionGraphGraphqlModule
import com.squareup.graphql.dataloaders.FlowDataLoaderDispatcher
import kotlinx.coroutines.future.await
import kotlinx.coroutines.runBlocking
import misk.testing.MiskTest
import misk.testing.MiskTestModule
import okhttp3.Headers
import org.junit.jupiter.api.Test
import org.assertj.core.api.Assertions.assertThat

@MiskTest(startService = true)
class CashCustomerTransactionsQueryTest {
  @MiskTestModule
  private val module = TransactionGraphTestingModule()

  @Test
  fun `returns an array of CashTransactions`() = runBlocking<Unit> {
    val query = """
                       {
                                       cashCustomerTransactions(customerToken: "customerToken") {
                                         id
                                         reasonCode
                                         createdAt
                                       }
                                     }
    """.trimIndent()
    val result = execute(query)

    assertThat(result["errors"]).isNull()

    assertThat(result["data"]).isEqualTo(
      mapOf(
        "cashCustomerTransactions" to arrayOf(
          mapOf(
            "createdAt" to "2019-03-20T18:26:18Z",
            "id" to "TOKEN",
            "reasonCode" to "CARD_PRESENT_PURCHASE"
          )
        )
      )
    )
  }

  private suspend fun execute(query: String): Map<String, Any> {
    val franklinClient = FakeFranklinClient()
    val dataLoaderRegistryFactory = DataLoaderRegistryFactory()
    val flowDataLoaderDispatcher = FlowDataLoaderDispatcher(dataLoaderRegistryFactory)

    return flowDataLoaderDispatcher.run { registry ->
      val contextFactory: GraphQLContextFactory =
        TransactionGraphContextFactory(franklinClient)
      TransactionGraphGraphqlModule().graphQL().executeAsync {
        it
          .query(query)
          .context(contextFactory.build(Headers.Builder().build(), registry))
      }.await().toSpecification()
    }
  }
}

运行测试时,它失败并出现以下错误:expected: "{"cashCustomerTransactions"=[{"createdAt"="2019-03-20T18:26:18Z", "id"="TOKEN", "reasonCode"="CARD_PRESENT_PURCHASE"}]} (SingletonMap@58303289)" but was: "{"cashCustomerTransactions"=[{"createdAt"="2019-03-20T18:26:18Z", "id"="TOKEN", "reasonCode"="CARD_PRESENT_PURCHASE"}]} (LinkedHashMap@c32f16d)"

除了一个是 SingletonMap 和一个是 LinkedHashMap 之外,以下响应似乎是相同的。我不明白为什么类型不同。我做错了什么?有人可以指出我正确的方向。谢谢

标签: unit-testingkotlintestinggraphql

解决方案


更改arrayOflistOf,问题将得到解决。


推荐阅读