当前位置: 首页 > 知识库问答 >
问题:

如何为opportunity上的apex触发器编写测试类

司徒俊雄
2023-03-14

我创建了一个触发器,它调用future类对第三方url进行http调用,这里一切正常,但测试类没有覆盖opportunity字段IsWon

//Apex触发器

trigger oppTrigger on Opportunity (before update) {

String oppType = '';
for(Opportunity opp : Trigger.new){

if (opp.IsClosed == true){  // closed
  if (opp.IsWon == true){
    oppType = 'Won'; // closed-won
   }else{
    oppType = 'Lost'; // closed-lost
   }
} else { // open
       oppType = 'Open'; 
    }
  // call a method with @future annotation
   futureCls.srvcCallout(opp.id,opp.Amount,oppType); 
 }
}

//具有future方法的触发器的future类

global class futureCls {
@future(callout=true)
Public static void srvcCallout(String oppId, Decimal oppAmt, String oppType){

     // Create http request
     HttpRequest req = new HttpRequest();
     req.setMethod('POST');
     req.setHeader('Content-Type', 'application/json;charset=UTF-8');     
     req.setEndpoint('https://www.testurl.com/salesforce/opp-change'+'?id='+oppId+'&amt='+oppAmt+'&stage='+oppType);

     // create web service
     Http http = new Http();
      try {
        // Execute web service call here     
        HTTPResponse res = http.send(req);  
        // Debug messages
        System.debug('RESPONSE:'+res.toString());
        System.debug('STATUS:'+res.getStatus());
        System.debug('STATUS_CODE:'+res.getStatusCode());
        System.debug('BODY:'+res.getBody());

        } catch(System.CalloutException e) {
             // Exception handler
             System.debug('Error connecting to Paperless..');
       }   
     }
 }

//我被卡住的触发器的测试类:-

@isTest
private class futureCls_Test {  

 private static testMethod void srvcCallout_Test() {        

    Test.startTest();

    // Unit test to cover trigger update event
    Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Probability = 95, CloseDate=system.today());
    insert opp;
    opp.Amount = 1000;
    opp.StageName = 'Closed/Won';
    update opp;

    // Assign some test values
    String oppId = '1sf2sfs2';
    Decimal oppAmt = 4433.43;
    String oppType = 'Won';

    // Unit test to cover future method
    futureCls.srvcCallout(oppId, oppAmt,oppType);    

    // Unit test to cover http web service
    Test.setMock(HttpCalloutMock.class, new futureClsCalloutMock()); 
    Test.stopTest();

  }
}

共有1个答案

井逸明
2023-03-14

您的测试类必须执行以下操作才能触发所有触发器:

注意,这只是一种方法,你可以用几种不同的方法

  • 创建新商机

如果您问我,创建opportunity并将其更新为指定状态的TestDataFactory函数将非常有用:

@isTest
public testOpportunityWithStatusChange(targetStatus){
    //do stuff here
};

然后,您可以为您想要在测试类中检查的每个状态调用该工厂一次,以覆盖触发器。

 类似资料:
  • 有人能给我解释一下如何为下面这样的apex触发器编写测试类吗? 我是Salesforce的新手。有人帮助我如何为上述触发器编写顶点类(测试类)吗? AccountBrowseExtensionTesttestAccountBrowseSystem。DmlException:插入失败。第0行第一个异常;第一个错误:FIELD\u CUSTOM\u VALIDATION\u EXCEPTION,Cit

  • 我已在Salesforce APEX中记录了触发器。它工作正常。 触发器代码为: 现在我正在尝试为它的测试类编写代码。它在线上给出错误,说对象无法解析为字符串。 测试等级代码为: 期待找到解决方案。任何帮助都将不胜感激。 谢谢

  • 我在Apex中有一个触发器。如何编写检查触发器是否被调用的单元测试?

  • tl;dr-在继续测试之前,如何使测试类等待特定触发器完成其更新或插入? 出身背景 我有一个触发器,每当创建帐户对象时都会创建一个新的对象,然后将这两条记录相互关联(请参阅下面的帐户触发器)。 我还在Portal\u Content\u c对象上创建了一个触发器,在删除记录时触发该触发器。删除时,触发器会查找相关的帐户记录并将其删除(请参见下面的门户内容触发器)。 我的问题是关于我的门户内容测试类

  • 我已经为此发疯了。我的IF循环中没有任何东西通过我的测试类触发,我不知道为什么。我在网上阅读了很多,看起来我做的事情是正确的,但它仍然没有解决我的代码覆盖率。这是运行的最后一行:如果(isIn==True){ 之后我无法让任何东西在IF循环中运行,我已经颠倒了逻辑,它仍然无法运行。我觉得当有人指出它时,我会踢自己,但这是我的代码: } 这是我的测试类:

  • 我对机会产品(i.e.line项)使用存储在Opp本身中的opp术语进行计算(例如:OLI. RecurringAmt=OPP. Term*OLI. UniPRICE*OLI. QUANTITY) 如果Opp中的术语(整数)的值发生变化,则需要手动更新每个OLI中的数学值。我建议在Opp上使用触发器,以便在术语更改时进行此更新。 问题是:由于Opp中的金额字段由SFDC自动计算为每个相关行项目的单