我有一个顶点类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调用。
答案 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();
}