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异常。
具体修复步骤
- 在测试类中提前创建测试数据:插入一条关联到当前测试用户的
Card__c记录,确保业务方法能查询到数据。 - 优化业务类的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
相关产品推荐
相关产品推荐

