Chatter APIについて

今回はChatter APIについて簡単に解説します。
と言っても、今更Chatterの機能だったり、膨大なChatter REST APIのアクションについての説明はしません。
あくまで、認定上級デベロッパーの試験対策のため、テストで押さえておきたいポイントを簡単にまとめます。

Chatter REST APIの機能などはリファレンスを参照。

スポンサーリンク

まず、用語の確認を

まずは用語について、似たような言葉が多く、僕がわからなくなってしまたので、今一度整理してみました。

用語 意味
Chatter REST API Chatterの機能をREST経由で様々なアクションを実現するためのAPI
Chatter API これもよく、リファレンス等で表記されていますが、RESTが省略されているだけで、Chatter REST APIのことを指すと思ってください。
ConnectApi Chatter REST APIをApex上で扱うために使用される名前空間のこと。これを使うことでChatterデータが単純な方法で公開される。クラスではないので注意。
Chatter in Apex Apex上でChatter機能を使用したもの。暗にConnectApi を使用したApexのことを指す

私的解釈なので多少言葉の定義は異なるかもしれません。
今でもあまりピンと来ていませんが、こんな理解でいます。

ConnectApiの特徴で注意するべきこと

Chatter in Apexで使用する際、ConnectApiを扱いますが、ちょっと特殊な使い方になるため、以下の点に注意が必要です。ここを抑えておけばテスト対策はOKかと

  • システムモードでは実装されず、現在のユーザ(コンテキストユーザ)のコンテキストで実行される
    →そのため、テストクラスでのSystem.runAsメソッドをサポートしていない
    また、コンテキストユーザのIDを引数として指定するメソッドで、IDの代わりに文字列meを使用することができる
  • ほとんどのConnectApiのメソッドは、テストクラスにおいても実際の組織データへのアクセス権が必要で、@IsTest(SeeAllData=true)を指定しないとエラーとなる
  • ConnectApiの一部のメソッド(getFeedElementsFromFeedなど)ではテストで組織データにアクセスすることが認められない

あれっ、厄介なことに2番目と3番目の内容が若干矛盾していますね。
さて、どうしましょう。

テストクラスの書き方

ConnectApiを使用したApexクラスは、原則@IsTest(SeeAllData=true)を使用することになりますが、getFeedElementsFromFeedなどの一部SeeAllData=trueを使えないメソッドは、setTestメソッドでテストをするよって宣言して、出力がテストコンテキストで返されるように登録する必要があります。

これがコードです。リファレンスの内容そのままです。
ソースコードは同じですが、一部コメントは日本語に書いています。

NewsFeedClass.cls

global class NewsFeedClass {
    global static Integer getNewsFeedCount() {
        ConnectApi.FeedElementPage elements = 
            ConnectApi.ChatterFeeds.getFeedElementsFromFeed(null,
                ConnectApi.FeedType.News, 'me');
        return elements.elements.size();
    }
}

NewsFeedClassTest.cls

@isTest
private class NewsFeedClassTest {
    // see all dataはfalseにしておく
    @IsTest
    static void doTest() {
        // テストデータ作成(Chatterフィード要素の構築)
        ConnectApi.FeedElementPage testPage = new ConnectApi.FeedElementPage();
        List<ConnectApi.FeedItem> testItemList = new List<ConnectApi.FeedItem>();
        testItemList.add(new ConnectApi.FeedItem());
        testItemList.add(new ConnectApi.FeedItem());
        testPage.elements = testItemList;
        // テスト対象となるメソッドに、出力コンテキストが返されるようにするため
        // setTestGetFeed+「メソッド名」の最後の引数で指定する
        ConnectApi.ChatterFeeds.setTestGetFeedElementsFromFeed(null,
            ConnectApi.FeedType.News, 'me', testPage);

        // テスト実行
        Test.startTest();
        System.assertEquals(2, NewsFeedClass.getNewsFeedCount());
        Test.stopTest();
    }
}

まとめ

ちょっと僕も知識が浅い分、うまく説明ができませんでしたが、抑えておくべきポイントは以下の通りです(ほぼ前述した通りですが)。

  • ConnectApiを使用したChatter in Apexのテストは原則@IsTest(SeeAllData=true)を使用する
  • getFeedElementsFromFeedなどの一部組織データへのアクセスが許可されないテストでは、setTest+メソッド名をテストクラス内にて宣言する
  • System.runAsメソッドがサポートされていない代わりに、コンテキストユーザのIDを引数として指定するメソッドで、文字列’me’を使用することができる

コメント