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

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

金成济
2023-03-14

我有一个触发器,当opportunity更新时触发,作为其中的一部分,我需要调用我们的API,并提供opportunity的一些详细信息。

根据Web上的许多建议,我创建了一个类,其中包含一个@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方法的方法是用测试来围绕调用。startTest()

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个答案

单于经纬
2023-03-14

由于未使用HttpCalloutMock,调用被跳过。

我假设WDHttpCalloutMock实现了HttpCalloutMock?

如果是,请调用进行测试。setMock应该让它将模拟的响应返回到调用。

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

顺便说一句,Salesforce StackExchange网站是询问Salesforce具体问题的好地方。

 类似资料:
  • 我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?

  • 我有以下方法,它采用UNIX时间戳并以天、小时或分钟的形式返回年龄。我想用JUnit单元测试它,但我不确定如何开始这样做,因为当前时间不断变化。有什么建议吗?谢谢! 方法如下: }

  • 我需要一些软件测试方面的指导。 我把事情复杂化了,但我太专注了,看不到我做错了什么,也看不到其他做事方式。 我有几个公共方法使用相同的私有方法。 私有方法本身: 必须为其特定角色处理许多场景 假设私有方法需要5个测试来覆盖所有场景,并由6个公共方法使用。 问题 > 然后我是否需要至少5x6个测试? 如何对每个公共方法重复使用私有方法的测试? 有没有关于重构重复测试的示例/文章? 示例 OnStar

  • 问题内容: 如果我有这样的控制器: 基本上,我从存储库中获取东西,然后将其投影到匿名类型中。 如何进行单元测试? 有一个名为的属性,但它的类型与我们预期的一样。 这是否意味着如果我想测试JSON对象是否具有我期望的属性(“ id”,“ name”,“ type”),我是否必须使用反射? 编辑: 这是我的测试: 但是我在循环中收到一个运行时错误,指出“对象不包含id的定义”。 当我将断点定义为匿名类

  • 本文向大家介绍对 Vue-Router 进行单元测试的方法,包括了对 Vue-Router 进行单元测试的方法的使用技巧和注意事项,需要的朋友参考一下 由于路由通常会把多个组件牵扯到一起操作,所以一般对其的测试都在 端到端/集成 阶段进行,处于测试金字塔的上层。不过,做一些路由的单元测试还是大有益处的。 对于与路由交互的组件,有两种测试方式: 使用一个真正的 router 实例 mock 掉 $r

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样: