Vault查询现金流量测试不起作用

时间:2018-08-19 16:31:02

标签: corda

在流量测试中发放一些现金-流程返回交易,并显示正确的现金状态。但是,当我对现金状态进行保管查询时,什么也不会返回。我想念什么吗?

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();
} }

IssueTokenFlow 测试

@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

}

1 个答案:

答案 0 :(得分:2)

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

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;
    });
}