为Corda流程编写测试用例时能否使用RPC?无法访问RPC客户端怎么办?
1. 在为Corda流程编写测试用例的过程中,是否可以使用RPC?
当然可以,但要结合你的测试场景来决定是否必要。
Corda官方提供的MockNetwork是大多数流程单元测试的首选——它在内存中模拟节点交互,速度快且不需要真实网络,适合测试流程的核心业务逻辑。但如果你需要测试客户端通过RPC调用流程的完整链路,或者验证节点对外暴露的RPC服务是否正常工作(比如权限控制、返回结果格式),那么使用RPC是完全合理的。
比如,当你要测试一个外部系统如何通过RPC触发Corda流程、查询账本状态时,直接在测试中启动带RPC服务的节点,用CordaRPCClient连接并调用,能更贴近生产环境的真实场景。
2. 在为Corda流程编写测试用例时,遇到无法访问RPC客户端的问题该如何解决?
遇到连接问题时,可以按以下步骤排查:
检查节点RPC配置是否正确
确保测试用的节点配置文件(node.conf)中开启了RPC服务,并且配置了正确的端口和授权用户:rpcSettings { address="localhost:10006" adminAddress="localhost:10046" } rpcUsers=[ { username="testUser" password="testPass" permissions=["InvokeRpc.StartFlow", "InvokeRpc.VaultQuery"] } ]测试环境中,这些配置要确保被正确加载,比如用
DriverDSL启动节点时,要通过nodeConfig参数传入这些配置。确认节点已完全启动
在测试代码中,启动节点后不要立刻尝试连接RPC——节点初始化需要时间。可以通过node.start().get()(同步等待启动完成),或者监听节点的状态变化,直到节点进入RUNNING状态再建立RPC连接。核对RPC客户端的连接参数
确保客户端使用的主机、端口和节点配置完全一致,用户名密码也和rpcUsers中的匹配。比如:val client = CordaRPCClient(NetworkHostAndPort("localhost", 10006)) val proxy = client.start("testUser", "testPass").proxy这里的端口必须和节点
rpcSettings.address中的端口对应。注意测试框架的限制
MockNetwork是纯内存模拟,默认不提供RPC服务——如果你在MockNetwork测试中尝试连接RPC,肯定会失败。这种情况下,如果你需要测试RPC逻辑,应该改用DriverDSL来启动真实的节点实例,它会为每个节点分配真实的RPC端口,并支持RPC连接。检查RPC用户的权限
即使连接成功,如果用户没有对应的权限,调用RPC方法时也会报错。确保rpcUsers中的permissions列表包含你要调用的RPC方法所需的权限,比如启动流程需要InvokeRpc.StartFlow,查询 vault 需要InvokeRpc.VaultQuery。排查端口占用或防火墙问题
测试环境中,确保RPC端口没有被其他进程占用,可以用netstat -ano | findstr :10006(Windows)或lsof -i :10006(Linux/Mac)检查端口是否被监听。另外,本地防火墙可能会阻止测试程序访问节点的RPC端口,临时关闭防火墙测试是否能解决问题。
内容的提问来源于stack exchange,提问作者Alok Verma

