在Corda的合同测试中(来自Git存储库的IOUIssueTests),mustIncludeIssueCommand()的测试期望发生异常,但不会抛出异常。
public void mustIncludeIssueCommand() {
IOUState iou = new IOUState(Currencies.POUNDS(1), ALICE.getParty(), BOB.getParty());
ledger(ledgerServices, l -> {
l.transaction(tx -> {
tx.output(IOUContract.IOU_CONTRACT_ID, iou);
tx.command(Arrays.asList(ALICE.getPublicKey(), BOB.getPublicKey()), new Commands.DummyCommand()); // Wrong type.
return tx.failsWith("Contract verification failed");
});
l.transaction(tx -> {
tx.output(IOUContract.IOU_CONTRACT_ID, iou);
tx.command(Arrays.asList(ALICE.getPublicKey(), BOB.getPublicKey()), new IOUContract.Commands.Issue()); // Correct type.
return tx.verifies();
});
return null;
});
}
此操作失败
java.lang.AssertionError: Expected exception but didn't get one
at net.corda.testing.dsl.Verifies$DefaultImpls.failsWith(LedgerDSLInterpreter.kt:66)
at net.corda.testing.dsl.TransactionDSLInterpreter$DefaultImpls.failsWith(TransactionDSLInterpreter.kt)
at net.corda.testing.dsl.TestTransactionDSLInterpreter.failsWith(TestDSL.kt:67)
at net.corda.testing.dsl.TransactionDSL.failsWith(TransactionDSLInterpreter.kt)
我尝试在解决方案仓库中运行代码,这似乎也失败了。我缺少什么吗?
答案 0 :(得分:1)
Corda培训应用程序背后的目的之一就是表明预期会失败,在这种情况下,您可以看到单元测试期望事务失败:return tx.failsWith("Contract verification failed");
在单元测试的前面,我们可以看到测试失败的原因:new Commands.DummyCommand()
这不是有效的命令,IOUContract
应该使事务失败,因为它与{{ 1}}命令。
切换到Issue
类时,必须有一行检查事务中包含的命令。执行此操作的方法是IOUContract
。确保您通过了正确的命令,并且应该能够通过流测试的这一步。
出于教育原因,我避免在此处给出完整的答案,但是您可以在培训的解决方案存储库中查看答案。