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

Apex中UpdateMyCard类测试报错:查询无数据分配给SObject

解决Apex测试类查询无数据的异常问题

我是Apex和SOQL新手,编写测试类时遇到问题:调用测试方法时触发查询无数据的异常,请求帮助。

业务类代码

public class UpdateMyCard {
    @AuraEnabled(cacheable=false)
    public static Card__c updateCard(Double Amount){
        String userId = UserInfo.getUserId();
        Card__c myCard = [SELECT Id, Card_no__c, total_spend__c From Card__c Where OwnerId =:userId];
        myCard.total_spend__c = myCard.total_spend__c + Amount;
        try{
            update myCard;
        }catch (Exception e) {
           System.debug('unable to update the record due to'+e.getMessage());
        }
        return myCard;
    }
}

测试类代码

@isTest
public static void updatecard(){
    UpdateMyCard.updateCard(200);
}

报错信息

System.QueryException: List has no rows for assignment to SObject

解决方法

核心原因

Salesforce测试环境是完全隔离的,不会包含生产或其他环境的真实数据。你的测试类直接调用业务方法时,没有提前创建对应的Card__c记录,导致SOQL查询不到数据,触发List has no rows异常。

具体修复步骤

  1. 在测试类中提前创建测试数据:插入一条关联到当前测试用户的Card__c记录,确保业务方法能查询到数据。
  2. 优化业务类的SOQL查询逻辑:原代码直接将查询结果赋值给SObject,一旦无数据就会抛出未捕获的异常,建议改为查询列表后判断是否存在数据,增强代码健壮性。

修改后的测试类代码

@isTest
public class UpdateMyCardTest {
    @isTest
    public static void updatecard(){
        // 创建测试用的Card__c记录,关联到当前测试用户
        Card__c testCard = new Card__c(
            OwnerId = UserInfo.getUserId(),
            total_spend__c = 0.0, // 初始化消费总额
            Card_no__c = 'TEST123' // 填充必填字段,根据实际对象配置调整
        );
        insert testCard;
        
        // 调用业务方法
        Card__c updatedCard = UpdateMyCard.updateCard(200);
        
        // 可选:添加断言验证结果是否符合预期
        System.assertEquals(200.0, updatedCard.total_spend__c, '消费总额更新不正确');
    }
}

优化后的业务类代码(可选但推荐)

public class UpdateMyCard {
    @AuraEnabled(cacheable=false)
    public static Card__c updateCard(Double Amount){
        String userId = UserInfo.getUserId();
        // 查询列表而非直接赋值SObject,避免无数据时抛出异常
        List<Card__c> cardList = [SELECT Id, Card_no__c, total_spend__c From Card__c Where OwnerId =:userId LIMIT 1];
        if(cardList.isEmpty()){
            // 无数据时可以返回null或抛出自定义异常,根据业务需求处理
            return null;
        }
        Card__c myCard = cardList[0];
        myCard.total_spend__c = (myCard.total_spend__c == null ? 0.0 : myCard.total_spend__c) + Amount;
        try{
            update myCard;
        }catch (Exception e) {
           System.debug('unable to update the record due to'+e.getMessage());
           // 可以考虑抛出异常让上层处理,或者返回错误信息
        }
        return myCard;
    }
}

内容的提问来源于stack exchange,提问作者koffyone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:48:52