NetworkMapCache 在 MockNetwork 测试中为空

NetworkMapCache is empty in MockNetwork tests

我正在编写一些模拟所有内容的轻量级流测试,我 运行 出错,在所有节点上 NetworkMapService 仅包含节点本身。另一方面,身份服务包含参与测试的所有 3 个节点。

    net = MockNetwork()

    issuer = net.createNode(legalName = CHARLIE.name)
    alice = net.createNode(legalName = ALICE.name)
    bob = net.createNode(legalName = BOB.name)

    issuer.registerInitiatedFlow(IssueClaimFlow.Issuer::class.java)
    alice.registerInitiatedFlow(VerifyClaimFlow.Prover::class.java)

    MockServices.makeTestDatabaseAndMockServices(createIdentityService = { InMemoryIdentityService(listOf(ALICE_IDENTITY, BOB_IDENTITY, CHARLIE_IDENTITY), emptySet(), DEV_TRUST_ROOT) } )

    net.registerIdentities()

    net.runNetwork()

在这种情况下,在第一次调用 sendAndRecieve() 之前,流程进行得很顺利。我得到:

12:28:12.832 [模拟网络] WARN net.corda.flow.[8f685c46-9ab6-4d64-b3f2-6b7476813c3b] - 被意外异常终止 java.lang.IllegalArgumentException: 不知道派对 C=ES,L=Madrid,O=Alice Corp

有趣的是,测试仍然以绿色完成(你没有做任何有用的工作)。但它可能是另一个问题的主题。

我可以像这样手动设置缓存来克服它:

    alice.services.networkMapCache.addNode(issuer.info)

    bob.services.networkMapCache.addNode(alice.info)

但这是正确的方法吗?我在样本或任何地方都没有看到这样的东西。

如果您查看 MockNetwork.createNode 的定义,networkMapAddress 默认为 null

相反,您应该使用 MockNetwork.createSomeNodes,它会为您创建一个网络映射节点,然后将该节点设置为它创建的每个后续节点的网络映射。

这是来自 CorDapp Example 的示例:

network = MockNetwork()
val nodes = network.createSomeNodes(2)
a = nodes.partyNodes[0]
b = nodes.partyNodes[1]

您可以在此处查看完整示例:https://github.com/corda/cordapp-example/blob/release-V2/kotlin-source/src/test/kotlin/com/example/flow/IOUFlowTests.kt