function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ms-hase-q23eems-hase-q23ee 

REST API POSTメソッドのカバレッジが上がらない

お世話になっております。
@RestResourceでアノテートされたRESTAPIの開発を行っているのですが、テストコードがうまくいかず困っています。
次のコードは何が悪いのか分かる方はいらっしゃいますか?

本体:
@RestResource('/Test/')
global with sharing class Test {

@HttpGet
global static String doGet() {
    List<Map<String ,String>> result  ;

    String a = request.get('a');
    String b = request.get('b');
    String c = request.get('c');
    // 色々処理

    JSON.serialize(result);
}


@HttpPost
global static String doPost(String a, String b, String c) {
    List<Map<String ,String>> result;

    if ('param-a'.equals(a)) {
    
    }  else {

    }
    
    if ('param-b'.equals(b)) {
    
    }  else {

    } 
    // 他、色々処理
    


    return JSON.serialize(result)
}

}

これに対するテストコード:


-----------------------------------------
@IsTest
private class TestTest {

    // testing Get method
    static testMethod void testdoGet1() {
        RestRequest req = new RestRequest();
        RestResponse res = new RestResponse();

        req.headers.put('Accept','application/json');
        req.headers.put('Content-Type','application/x-www-form-urlencoded');
        req.requestURI = 'https://ap.salesforce.com/services/apexrest/Test/';
        req.params.put('a','param-test1');
        req.params.put('b','param-test2');
        req.httpMethod = 'GET';

        Test.doGet();
    }


    // testing Post method
    static testMethod void testdoGet1() {
        RestRequest req = new RestRequest();
        RestResponse res = new RestResponse();
        String result  ;

        req.headers.put('Accept','application/json');
        req.requestURI = 'https://ap.salesforce.com/services/apexrest/Test/';
        req.httpMethod = 'POST';

        RestContext.request = req;
        RestContext.response = res;

        result = Test.doPost('param-a', 'param-b','param-c' );
        result = Test.doPost('param-ab', 'param-bc','param-c' );
        result = Test.doPost('param-a', 'param-b','' );

    }
}



GETメソッドに関しては// 色々処理 ・・・に入り、期待通りにコードをテストしてくれています。
POSTメソッドは全くテストできません。


正常系: 
Test.doPost('param-a', 'param-b','param-c' );
Test.doPost('param-ab', 'param-bc','param-c' );

異常系: 
Test.doPost('param-b', 'param-b','' );

など、何を書いてもカバレッジが上がりません。
if ('param-a'.equals(a)) { (の分岐に入っていないように見えます)

そもそも、doPost()の中に入っいないかも・・・・。

何が悪いのかさっぱり分かりません。


Best Answer chosen by ms-hase-q23ee
Taiki YoshikawaTaiki Yoshikawa
@RestResource処理のサンプルコードを作成しました。@RestResource処理のテストクラスはこんな感じで実装できます。
https://github.com/tyoshikawa1106/apex-rest-resource-sample/blob/master/src/classes/RestAccountManagerTest.cls

All Answers

Taiki YoshikawaTaiki Yoshikawa
実際に使用しているかわかりませんが、「Test」いうクラス名はSalesforceのシステム上で既に使用されています。
以前、クラス名に「Test」を指定したところ、テストクラスが通らなくなったという話を聞いたことが有ります。

実際のクラス名に使用していなければ問題ありませんが、もし使用しているのでしたら別のクラス名に変更してみてください。
Taiki YoshikawaTaiki Yoshikawa
@RestResource処理のサンプルコードを作成しました。@RestResource処理のテストクラスはこんな感じで実装できます。
https://github.com/tyoshikawa1106/apex-rest-resource-sample/blob/master/src/classes/RestAccountManagerTest.cls
This was selected as the best answer
Taiki YoshikawaTaiki Yoshikawa
ちなみにDiscussionBoardの投稿機能はコードの挿入もサポートしています。
User-added image

画像やリンクの挿入も可能です。よろしければご利用下さい。