如何对使用标注的@future方法进行单元测试?

时间:2014-09-05 10:42:32

标签: unit-testing salesforce apex-code

我有一个触发器在机会更新时触发,作为其中的一部分,我需要通过机会中的一些细节调用我们的API。

根据网络上的许多建议,我创建了一个包含@future方法的类来制作标注。

我试图捕捉@future方法中引发的异常,但测试方法没有看到它。

受测试的课程如下:

public with sharing class WDAPIInterface {
    public WDAPIInterface() {

    }

    @future(callout=true) public static void send(String endpoint, String method, String body)  {
        HttpRequest req = new HttpRequest();
        req.setEndpoint(endpoint);
        req.setMethod(method);
        req.setBody(body);

        Http http = new Http();
        HttpResponse response = http.send(req);

        if(response.getStatusCode() != 201) {
            System.debug('Unexpected response from web service, expecte response status status 201 but got ' + response.getStatusCode());
            throw new WDAPIException('Unexpected response from web service, expecte response status status 201 but got ' + response.getStatusCode());
        }
    }
}

这是单元测试:

@isTest static void test_exception_is_thrown_on_unexpected_response() {
    try {
        WDHttpCalloutMock mockResponse = new WDHttpCalloutMock(500, 'Complete', '', null);
        WDAPIInterface.send('https://example.com', 'POST', '{}');
    } catch (WDAPIException ex) {
        return;
    }

    System.assert(false, 'Expected WDAPIException to be thrown, but it wasnt');
}

现在,我已经读过测试@future方法的方法是使用Test.startTest()& amp;来围绕调用。 Test.endTest(),但是当我这样做时,我得到另一个错误:

METHOD RESULT 
test_exception_is_thrown_on_unexpected_response : Skip

 MESSAGE 
Methods defined as TestMethod do not support Web service callouts, test skipped

所以问题是,我如何对发出标注的@future方法进行单元测试?

1 个答案:

答案 0 :(得分:1)

由于没有使用HttpCalloutMock,因此跳过了标注。

我假设WDHttpCalloutMock实现了HttpCalloutMock?

如果是这样,对Test.setMock的调用应该让它将模拟的响应返回给标注。

WDHttpCalloutMock mockResponse = new WDHttpCalloutMock(500, 'Complete', '', null);
Test.setMock(HttpCalloutMock.class, mockResponse);
WDAPIInterface.send('https://example.com', 'POST', '{}');

顺便说一下,Salesforce StackExchange site是向Salesforce提出具体问题的好地方。