如果取决于某个先前状态,如何设置一个流的UT?

时间:2018-07-30 09:15:54

标签: corda

这是我的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令牌状态。

希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

上面的代码中似乎有一个错误。在最后一行中,您声明:

assertEquals(tokenStates.size(), 0);

鉴于此,由于您期望节点的保管库中处于某种状态,因此应该为:

assertEquals(tokenStates.size(), 1);