Corda可调度状态导致流测试挂起

Corda可调度状态导致流测试挂起,corda,Corda,我有一个贷款状态是计划状态。所有使用LoanState的流测试都会无限挂起。如果我将nextScheduledActivity()设置为returnnull,那么测试运行正常。单元测试日志中没有可见错误。 这是科尔达3.2 这是控制台挂起前的最后一位文本: [信息]14:39:40604[模拟节点1线程] (FlowstateMachinempl.kt:419) 流量。[742bd708-244d-49a0-91af-8127267029a1]。启动会话- 启动与O方的流程会话=模拟公司2,L=

我有一个贷款状态是计划状态。所有使用LoanState的流测试都会无限挂起。如果我将
nextScheduledActivity()
设置为
returnnull
,那么测试运行正常。单元测试日志中没有可见错误。 这是科尔达3.2

这是控制台挂起前的最后一位文本:

[信息]14:39:40604[模拟节点1线程] (FlowstateMachinempl.kt:419) 流量。[742bd708-244d-49a0-91af-8127267029a1]。启动会话- 启动与O方的流程会话=模拟公司2,L=London,C=GB。 用于跟踪目的的会话id为 会话ID(toLong=4148369640629821591)。{}[INFO]14:39:40619[Mock] 节点2线程](StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit-接受流 来自O方的会话=模拟公司1,L=伦敦,C=GB。的会话id 跟踪目的是SessionId(toLong=4148369640629821591)。 {调用id=2c33f7e4-63bd-4fad-98a0-6b568a78136d, 调用时间戳=2020-03-23T19:39:40.619Z, 会话id=2c33f7e4-63bd-4fad-98a0-6b568a78136d, session_timestamp=2020-03-23T19:39:40.619Z}[INFO]14:39:40706[Mock] 节点1线程](FlowStateMachineImpl.kt:419) 流量。[742bd708-244d-49a0-91af-8127267029a1]。启动会话- 启动与O方的流程会话=模拟公司2,L=London,C=GB。 用于跟踪目的的会话id为 SessionId(toLong=-5160466662167158789)。{}[INFO]14:39:40715[Mock] 节点2线程](StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit-接受流 来自O方的会话=模拟公司1,L=伦敦,C=GB。的会话id 跟踪目的是SessionId(toLong=-5160466662167158789)。 {调用id=af86ddea-0bae-43eb-998c-c2ae3fc91fcf, 调用时间戳=2020-03-23T19:39:40.715Z, 会话id=af86ddea-0bae-43eb-998c-c2ae3fc91fcf, session_timestamp=2020-03-23T19:39:40.715Z}[INFO]14:39:40742[Mock] 节点1线程](FlowStateMachineImpl.kt:419) 流量。[742bd708-244d-49a0-91af-8127267029a1]。启动会话- 启动与O方=母公司、L方=伦敦、C方=GB的流程会话。 用于跟踪目的的会话id为 会话ID(toLong=669366712851379995)。{}[INFO]14:39:40750[Mock] 节点3线程](StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit-接受流 来自O方的会话=模拟公司1,L=伦敦,C=GB。的会话id 跟踪目的是SessionId(toLong=669366712851379995)。 {actor_id=仅用于测试,actor_owningIdentity=O=父公司, L=London,C=GB,actor\u store\u id=TEST, 调用id=487f4d03-c5b7-4aea-81a6-a000e788e0a2, 调用时间戳=2020-03-23T19:39:40.750Z, 会话id=487f4d03-c5b7-4aea-81a6-a000e788e0a2, 会话时间戳=2020-03-23T19:39:40.750Z}

如果我将流名称设置为不存在的流,那么测试将不会挂起并报告找不到该流


更新:确认挂起的是waitQuiscent()。如果我删除它并用Thread.sleep()替换它,我的测试就会通过。看起来waitQuiscent在等待所有ScheduledActivity完成。在不等待ScheduledActivities完成的情况下,是否需要等待来处理相同类型的功能

您可能没有调用MockNetwork.runNetwork方法。以下是一个例子:

@Test
public void testCreateAuctionFlow() throws Exception {
    CreateAssetFlow assetflow = new CreateAssetFlow("Test Asset", "Dummy Asset", dummy.png");
    CordaFuture<SignedTransaction> future = a.startFlow(assetflow);
    network.runNetwork();
    SignedTransaction signedTransaction = future.get();
    Asset asset = (Asset) signedTransaction.getTx().getOutput(0);
    CreateAuctionFlow.Initiator auctionFlow = new CreateAuctionFlow.Initiator(Amount.parseCurrency("1000 USD"),
            asset.getLinearId().getId(), LocalDateTime.ofInstant(Instant.now().plusMillis(30000), ZoneId.systemDefault()));
    CordaFuture<SignedTransaction> future1 = a.startFlow(auctionFlow);
    network.runNetwork();
    SignedTransaction transaction = future1.get();
    AuctionState auctionState = (AuctionState) transaction.getTx().getOutput(0);
    assertNotNull(auctionState);
}
@测试
public void TestCreateAutionFlow()引发异常{
CreateAssetFlow assetflow=新的CreateAssetFlow(“测试资产”,“虚拟资产”,Dummy.png”);
CordaFuture future=a.startFlow(assetflow);
runNetwork();
SignedTransaction SignedTransaction=future.get();
Asset Asset=(资产)signedTransaction.getTx().getOutput(0);
CreateAuctionFlow.Initiator auctionFlow=新的CreateAuctionFlow.Initiator(Amount.parseCurrency(“1000美元”),
asset.getLinearId().getId(),LocalDateTime.ofInstant(Instant.now().plusMillis(30000),ZoneId.systemDefault());
CordaFuture future1=a.startFlow(拍卖流);
runNetwork();
SignedTransaction事务=future1.get();
AuctionState AuctionState=(AuctionState)transaction.getTx().getOutput(0);
assertNotNull(拍卖状态);
}
触发每个流后,应调用
runNetwork
方法。这有助于模拟网络在节点之间正确跳转消息

有关更多详细信息,请查看此处的文档:


在这里的示例中查看
SchedulableState
的测试用例:

您能为您的测试类共享代码吗?
@Test
public void testCreateAuctionFlow() throws Exception {
    CreateAssetFlow assetflow = new CreateAssetFlow("Test Asset", "Dummy Asset", dummy.png");
    CordaFuture<SignedTransaction> future = a.startFlow(assetflow);
    network.runNetwork();
    SignedTransaction signedTransaction = future.get();
    Asset asset = (Asset) signedTransaction.getTx().getOutput(0);
    CreateAuctionFlow.Initiator auctionFlow = new CreateAuctionFlow.Initiator(Amount.parseCurrency("1000 USD"),
            asset.getLinearId().getId(), LocalDateTime.ofInstant(Instant.now().plusMillis(30000), ZoneId.systemDefault()));
    CordaFuture<SignedTransaction> future1 = a.startFlow(auctionFlow);
    network.runNetwork();
    SignedTransaction transaction = future1.get();
    AuctionState auctionState = (AuctionState) transaction.getTx().getOutput(0);
    assertNotNull(auctionState);
}