如何测试来自第一类内的第二类func调用的http调用(APEX类测试/ salesforce测试)

时间:2016-09-17 22:06:43

标签: unit-testing salesforce apex

我有一个顶点类A.我在A中调用B类的函数。

A级{

B bobj = new B(); B.function2();

功能1(); //在A类中

}

此function1和function2是对2个差异休息服务的http调用。

我为function1和function2编写了一个带有httpcallmockouts的测试类。所以APEX测试类中的顺序就是这样 -

B objB = new B();

HttpResponse res = CalloutB.getInfoFromExternalService();

objA = new A(); HttpResponse res = CalloutA.getInfoFromExternalService();

//直到这一点,我的测试成功运行了http调用mock

Test.startTest();

objA.function1();

//这里我得到一个错误http callout不支持B类的function2的测试方法。

//如果我将上面的顺序更改为

//一个objA = new A();

// HttpResponse res = CalloutA.getInfoFromExternalService();

// B objB = new B();

// HttpResponse res = CalloutB.getInfoFromExternalService();

//然后我得到错误http callout不支持A类的function1的测试方法。

Test.stopTest();

那么,如何在第一个类的另一个类函数调用中测试http调用。

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您没有初始化httpMock类对象,因此您的测试类正在尝试访问测试类不允许的真实Web服务调用。您需要做什么来初始化mockClass对象并使用它来返回数据而不是点击真正的Web服务端点

  

在执行标注的主类中声明一个保持的变量   对创建的mockClass对象的引用

     

在你的callout类中添加一个条件,检查它是否是一个当前使用Test.isRunningTest()运行的测试类。

     

如果是测试类,则使用mock类返回数据而不是真正的callout

     

如果它不是测试类执行上下文,请使用实际标注

@isTest
global class ResultHttpMock implements HttpCalloutMock {

  global HTTPResponse respond(HTTPRequest req) {

    HttpResponse res;
    System.debug('request inside mock '+req);
    if(req != null) {

        res = new HttpResponse();
        res.setHeader('Content-Type', 'application/json');
        res.setBody(getBody());
        res.setStatusCode(200);
        res.setStatus('OK');

    }

    return res;
}

  private static String getBody() {
    String idmJsonMockResponse = '{"ednaScoreCard":{"sc":[],"etr":[{"test":"id:0","details":"false","ts":1471432074763,"stage":"1"},{"test":"ed:37","fired":false,"details":"ed:37(false) = true","ts":1471432074763,"stage":"1"}
}

在A类和B类中,保留对ResultHttpMock的引用

global class HttpCalloutClass {

public static HttpCalloutMock httpMock = null;
     ......
    if(Test.istestRunning() && httpMock != null) {
        Http response = httpMock.respond(request);
    } else {
        Http response = http.send(request);
    }
 }

在测试类中,在调用functionA()和functionB()之前初始化httpMock对象

@isTest(seeAllData=false)
public class TestHttp {

  static testMethod void testfunctionA() {

    Test.startTest();

    HttpCalloutClass.httpMock = new ResultHttpMock ();
    String result = HttpCalloutClass.functionA();

    Test.stopTest();
}