Corda 现金流入测试的Vault查询不工作

Corda 现金流入测试的Vault查询不工作,corda,Corda,在流测试中发出一些现金-流返回事务,输出显示正确的现金状态。但是,当我在vault中查询现金状态时,不会返回任何内容。我错过什么了吗 IssueTokensFlow @StartableByRPC public class IssueTokensFlow extends FlowLogic<SignedTransaction> { private static Double amount; public IssueTokensFlow(double amount) {

在流测试中发出一些现金-流返回事务,输出显示正确的现金状态。但是,当我在vault中查询现金状态时,不会返回任何内容。我错过什么了吗

IssueTokensFlow

@StartableByRPC 
public class IssueTokensFlow extends FlowLogic<SignedTransaction> {

private static Double amount;

public IssueTokensFlow(double amount) {
    this.amount = amount;
}

@Suspendable
@Override
public SignedTransaction call() throws FlowException {

    // We retrieve the notary identity from the network map.
    final Party notary = getServiceHub().getNetworkMapCache().getNotaryIdentities().get(0);

    // Issue cash tokens equal to transfer amount
    AbstractCashFlow.Result cashIssueResult = subFlow(new CashIssueFlow(
            Currencies.DOLLARS(amount), OpaqueBytes.of(Byte.parseByte("1")), notary)
    );

    return cashIssueResult.getStx();
} }
@StartableByRPC
公共类IssueTokensFlow扩展了FlowLogic{
私人静态双倍金额;
公开发行资金流动(双倍金额){
这个。金额=金额;
}
@暂停
@凌驾
public SignedTransaction调用()引发流异常{
//我们从网络地图中检索公证人身份。
最终参与方公证人=getServiceHub().getNetworkMapCache().getNotaryIdentities().get(0);
//发行等于转账金额的现金代币
AbstractCashFlow.Result cashIssueResult=子流(新的CashIssueFlow(
货币.美元(金额),OpaqueBytes.of(Byte.parseByte(“1”)),公证人)
);
返回cashfissueresult.getStx();
} }
发布肯流测试

@Test
public void testIssueCash() throws Exception {
    IssueTokensFlow flow =
           new IssueTokensFlow(100.00);

    SignedTransaction transaction = a.startFlow(flow).get();
    network.waitQuiescent();

    Cash.State state = (Cash.State) transaction.getTx().getOutputStates().get(0);

    assertEquals(state.getOwner(), chooseIdentity(a.getInfo()));
    assertEquals(state.getAmount().getQuantity(), Currencies.DOLLARS(100.00).getQuantity());
    // Above assertions pass


    QueryCriteria.VaultQueryCriteria criteria = new QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL);
    Vault.Page<ContractState> results = a.getServices().getVaultService().queryBy(Cash.State.class, criteria);

    assertTrue(results.getStates().size() > 0);
    // ^ This assertion fails

}
@测试
public void testIssueCash()引发异常{
IssueTokens流量=
新发行的Etokensflow(100.00);
SignedTransaction事务=a.startFlow(flow).get();
network.waitquisite();
Cash.State State=(Cash.State)transaction.getTx().getOutputStates().get(0);
assertEquals(state.getOwner(),chooseIdentity(a.getInfo());
资产质量(state.getAmount().getQuantity(),Currencies.DOLLARS(100.00).getQuantity());
//上述断言是正确的
QueryCriteria.VaultQueryCriteria条件=新建QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL);
Vault.Page results=a.getServices().getVaultService().queryBy(Cash.State.class,条件);
assertTrue(results.getStates().size()>0);
//^此断言失败
}

在Corda 3中,当您作为测试的一部分查询节点的数据库时(例如,从节点的vault中提取信息),必须将查询封装在数据库事务中,如下所示:

node.transaction(tx -> {
    // Perform query here.
}
因此,您的测试将成为:

@Test
public void testIssueCash() throws Exception {
    IssueTokensFlow2 flow = new IssueTokensFlow2(100.00);

    SignedTransaction transaction = a.startFlow(flow).get();
    network.waitQuiescent();

    Cash.State state = (Cash.State) transaction.getTx().getOutputStates().get(0);

    assertEquals(state.getOwner(), chooseIdentity(a.getInfo()));
    assertEquals(state.getAmount().getQuantity(), Currencies.DOLLARS(100.00).getQuantity());
    // Above assertions pass


    QueryCriteria.VaultQueryCriteria criteria = new QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL);
    a.transaction(() -> {
        Vault.Page<ContractState> results = a.getServices().getVaultService().queryBy(Cash.State.class, criteria);
        assertTrue(results.getStates().size() > 0);
        // ^ This assertion doesn't fail :)
        return null;
    });
}
@测试
public void testIssueCash()引发异常{
IssueTokensFlow2流量=新的IssueTokensFlow2(100.00);
SignedTransaction事务=a.startFlow(flow).get();
network.waitquisite();
Cash.State State=(Cash.State)transaction.getTx().getOutputStates().get(0);
assertEquals(state.getOwner(),chooseIdentity(a.getInfo());
资产质量(state.getAmount().getQuantity(),Currencies.DOLLARS(100.00).getQuantity());
//上述断言是正确的
QueryCriteria.VaultQueryCriteria条件=新建QueryCriteria.VaultQueryCriteria(Vault.StateStatus.ALL);
a、 交易(()->{
Vault.Page results=a.getServices().getVaultService().queryBy(Cash.State.class,条件);
assertTrue(results.getStates().size()>0);
//^此断言未失败:)
返回null;
});
}