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