【问题标题】:Corda with mockito_kotlin for unit testCorda 和 mockito kotlin 进行单元测试
【发布时间】:2018-01-29 18:28:07
【问题描述】:

您好,我正在尝试模拟查询链下数据库/单独外部系统的链下/API 命中。但是我在使用 mockito_kotlin 模拟来自函数的响应时遇到问题,似乎该部分在不同节点的启动期间没有被占用。

有没有例子或方法可以做到这一点?

已编辑:

我有一个函数callExternalService(),它将从 offLedger 服务返回一个字符串

class ExternalService {
  fun callExternalService() : String {
      // Call external service
      return externalResult
  }
}

在执行流程之前,我使用 Mockito 模拟了该类,如下所示:

val externalService = Mockito.mock(ExternalService::class.java)
Mockito.doReturn("Hello").`when`(externalService.callExternalService()).toString()

我试图在流程期间和FinalityFlow 之后调用模拟的callExternalService() 以获取一些模拟数据。然而,当单元测试运行时,模拟类不会被注入,并且 "Hello" 不会从类中返回。

因此,我怀疑在基本启动节点序列期间没有将模拟功能纳入节点,因为它仍在尝试访问外部服务,而我不想让另一个外部系统参与单元测试.

【问题讨论】:

  • 您能否发布您拥有和不工作的代码,以了解您想要实现的目标?
  • 为问题添加了详细说明* :)

标签: corda


【解决方案1】:

假设你有以下服务:

@CordaService
class ExternalService: SingletonSerializeAsToken() {
    fun callExternalService() : String {
        val externalResult = TODO("Call external service")
        return externalResult
    }
}

您需要将对服务的调用拉出到流程中的单独函数中。使这个单独的函数和流类本身打开,以便它们可以被覆盖:

@InitiatingFlow
@StartableByRPC
open class RealFlow : FlowLogic<String>() {
    @Suspendable
    override fun call(): String {
        return queryService()
    }

    @Suspendable
    open fun queryService(): String {
        return serviceHub.cordaService(ExternalService::class.java).callExternalService()
    }
}

现在创建一个覆盖queryService 的流的测试子类以返回虚拟数据而不是调用 API:

class TestFlow : RealFlow() {
    override fun queryService(): String {
        return "dummyData"
    }
}

您现在可以在流测试中使用TestFlow 来测试主要流的功能:

@Test
fun `example test`() {
    val flow = TestFlow()
    val future = node.services.startFlow(flow).resultFuture
    network.runNetwork()
    val externalResult = future.getOrThrow()
    assertEquals("dummyData", externalResult)
}

【讨论】:

  • 有没有办法指定单元测试时加载哪些 Corda 服务?我有一个问题,使用该服务的流被用作子流。而且我必须创建一个调用 TestSubFlow 的 TestFlow,它使用带有虚拟数据的模拟服务。 corda 服务的所有使用都是通过调用 serviceHub.cordaService 方法来完成的,我无法找到一种方法来用我的单元测试中的模拟服务替换在 cordaService 方法中调用的服务。
猜你喜欢
  • 2018-05-13
  • 1970-01-01
  • 2017-09-19
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多