这是我的demo source code,我创建了一个用于放置订单的流程“ OrderPlaceFlow $ Request”。
我想为此流程编写一个UT-PartyC和PartyB之间的订单交易,并且此流程需要来自PartyA和PartyB的某些令牌状态作为输入。
如何模拟或模拟PartyB具有来自PartyA的令牌状态?
按照@Joel的建议,我添加了先前的状态-PartyB中的令牌状态,但仍然无法通过API查询该状态-getVaultService()。queryBy。
以下是我的代码片段,或者从Github
获取完整的源代码。 TokenState tokenState = new TokenState(
nodeA.getInfo().getLegalIdentities().get(0),
nodeB.getInfo().getLegalIdentities().get(0),
99);
TransactionBuilder transactionBuilder = new TransactionBuilder(network.getDefaultNotaryIdentity());
transactionBuilder.addOutputState(tokenState, TokenContract.ID, network.getDefaultNotaryIdentity());
CommandData commandData = new TokenContract.Issue();
transactionBuilder.addCommand(commandData, nodeA.getInfo().getLegalIdentities().get(0).getOwningKey());
nodeA.transaction(() -> {
try {
transactionBuilder.verify(nodeA.getServices());
} catch (TransactionVerificationException e) {
assertEquals(1, 1);
} catch (TransactionResolutionException e) {
assertEquals(2, 2);
} catch (AttachmentResolutionException e) {
assertEquals(3, 3);
}
return null;
});
SignedTransaction partSignedTransaction = nodeA.getServices().signInitialTransaction(transactionBuilder);
SignedTransaction signedTransaction = nodeB.getServices().addSignature(partSignedTransaction);
nodeA.getServices().recordTransactions(signedTransaction);
nodeB.getServices().recordTransactions(signedTransaction);
//find a Token State for order
QueryCriteria.VaultQueryCriteria criteria = new QueryCriteria.VaultQueryCriteria(Vault.StateStatus.UNCONSUMED);
Vault.Page<TokenState> results = nodeB.getServices().getVaultService().queryBy(TokenState.class, criteria);
List<StateAndRef<TokenState>> tokenStates = results.getStates();
assertEquals(tokenStates.size(), 0);
谢谢乔尔。是的,我犯了一些愚蠢的错误,现在,我已修复了它们。 但是,我的UT仍然失败,并出现了以下错误:
org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [net.corda.node.services.vault.VaultSchemaV1$VaultStates#PersistentStateRef(txId=8F1461B9985457E9F5BC2AB72FD637621BB64649F58BE6D66114E48F24B6A555, index=0)]
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:169)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
我做了一些研究,保存98 TokenState时会出现此错误。 但是我不为什么,因为99令牌状态在PartyA和PartyB中保存了两次,但是PartyB无法保存98令牌状态。
希望有人可以帮助我。
答案 0 :(得分:0)
上面的代码中似乎有一个错误。在最后一行中,您声明:
assertEquals(tokenStates.size(), 0);
鉴于此,由于您期望节点的保管库中处于某种状态,因此应该为:
assertEquals(tokenStates.size(), 1);