如何在Ballerina单元测试中Mock本地导入模块的函数
Ballerina Mock本地模块方法不生效的解决办法
可能的原因及修复步骤
1. 确保Mock实例被正确注入
被测代码如果直接创建NotificationServiceClientImpl实例(如ngc:NotificationServiceClientImpl client = new();),测试代码中的Mock对象不会对其生效——两者是完全独立的实例。
- 修复:将客户端实例通过依赖注入传入被测逻辑,比如让被测函数接收
ngc:NotificationServiceClientImpl类型参数,测试时传入Mock实例。
2. 严格匹配方法签名
Ballerina的Mock对方法的参数数量、类型、甚至具名参数的名称都会严格校验,仅指定方法名可能无法触发Mock逻辑。
- 修复:如果目标方法有参数,需在
when()中添加参数匹配器:- 匹配任意参数:
test:prepare(clientMock).when("createApplication", test:any()).thenReturn(noti); - 匹配具体参数:
test:prepare(clientMock).when("createApplication", "test-app-id").thenReturn(noti);
- 匹配任意参数:
3. 检查模块依赖配置
测试模块的Ballerina.toml需正确依赖本地的wso2/notification_grpc_client模块,避免加载远程仓库的旧版本导致Mock失效:
[dependencies] "wso2/notification_grpc_client" = { path = "../path/to/your/local/module" }
4. 确认Mock初始化时机
必须在被测代码执行之前完成Mock的prepare和when配置,比如在测试函数开头就完成Mock设置,再调用被测逻辑。
示例代码
被测代码(修改为支持依赖注入)
import wso2/notification_grpc_client as ngc; public function processApplicationCreation(ngc:NotificationServiceClientImpl client, string appId) returns ngc:NotificationResponse { return client->createApplication(appId); }
测试代码(正确Mock写法)
import ballerina/test; import wso2/notification_grpc_client as ngc; type NotificationResponse record { string code; }; @test:Config function testProcessAppCreation() { // 定义Mock返回值 NotificationResponse mockResponse = {code: "OK"}; // 创建Mock实例 ngc:NotificationServiceClientImpl clientMock = test:mock(ngc:NotificationServiceClientImpl); // 配置Mock:匹配createApplication方法的任意string参数,返回预设响应 test:prepare(clientMock).when("createApplication", test:any()).thenReturn(mockResponse); // 传入Mock实例执行被测逻辑 NotificationResponse result = processApplicationCreation(clientMock, "APP-001"); // 验证结果 test:assertEquals(result.code, "OK"); }
内容的提问来源于stack exchange,提问作者Dilan Sachintha Nayanajith
相关产品推荐
相关产品推荐

