You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:47:05