【Salesforce 認定Platformデベロッパー】試験対策:第112問

問題

@isTestアノテーションに関して正しい説明はどれですか。 3つ選びなさい。

  • @isTest(SeeAllData=false)が付けられたクラス内の@isTest(SeeAllData=true)が付けられたメソッドは、すべての組織データにアクセスできます。
  • @isTest(SeeAllData=true)が付けられたクラス内の@isTest(SeeAllData=false)が付けられたメソッドは、すべての組織データにアクセスできます。
  • テストメソッドを含むクラスは、@isTestアノテーションの有無に関係なく、Apexコードの制限にカウントされます。
  • クラスが@isTest(SeeAllData=false)で付けられている場合でも、テスト内で製品と価格表は表示されます。
  • クラスが@isTest(SeeAllData=false)で付けられている場合でも、テスト内でプロファイルは表示されます。

正解

  • @isTest(SeeAllData=false)が付けられたクラス内の@isTest(SeeAllData=true)が付けられたメソッドは、すべての組織データにアクセスできます。
  • @isTest(SeeAllData=true)が付けられたクラス内の@isTest(SeeAllData=false)が付けられたメソッドは、すべての組織データにアクセスできます。
  • テストメソッドを含むクラスは、@isTestアノテーションの有無に関係なく、Apexコードの制限にカウントされます。
  • クラスが@isTest(SeeAllData=false)で付けられている場合でも、テスト内で製品と価格表は表示されます。
  • クラスが@isTest(SeeAllData=false)で付けられている場合でも、テスト内でプロファイルは表示されます。

解説


以下の箇条書きは、Salesforceの@IsTest(SeeAllData=true)アノテーションに関する重要な考慮事項をまとめたものです。

  • クラスが@IsTest(SeeAllData=true)で定義されている場合、この設定は明示的にSeeAllDataキーワードを設定していないクラス内の全てのテストメソッドに適用されます。
  • @IsTest(SeeAllData=true)アノテーションは、クラスレベルまたはメソッドレベルで設定可能で、設定されたレベルでのデータアクセスを可能にします。
  • クラスレベルで@IsTest(SeeAllData=true)が設定されている場合、そのクラス内のメソッドに@IsTest(SeeAllData=false)を設定しても、この設定は無視され、メソッドは全てのデータにアクセス可能です。
  • メソッドレベルで@IsTest(SeeAllData=true)が設定されている場合は、この設定がクラスレベルの@IsTest(SeeAllData=false)設定を上書きし、メソッドは全データにアクセスできます。

参考:isTest(SeeAllData=True) アノテーションの使用

上記のルールを表にまとめると以下のようになります。

クラスレベルの設定メソッドレベルの設定メソッドのデータアクセス備考
SeeAllData=falseSeeAllData=trueアクセス可メソッドレベルでの設定がクラスレベルを上書きする
SeeAllData=false(設定なし)アクセス不可クラスレベルの設定が適用される
SeeAllData=trueSeeAllData=falseアクセス可クラスレベルの設定が優先され、メソッドレベルは無視される
SeeAllData=true(設定なし)アクセス可クラスレベルの設定が適用される

つまり、クラスやメソッドのどちらかが、SeeAllData=trueに設定されていれば、テストメソッドは組織全データにアクセスできます。

それぞれの選択肢の理由について説明します。

□ @isTest(SeeAllData=false)が付けられたクラス内の@isTest(SeeAllData=true)が付けられたメソッドは、すべての組織データにアクセスできます。
これは正解です。メソッドレベルでの@isTest(SeeAllData=true)は、クラスレベルでの@isTest(SeeAllData=false)を上書きします。そのため、そのメソッドはすべての組織データにアクセスできます。

□ @isTest(SeeAllData=true)が付けられたクラス内の@isTest(SeeAllData=false)が付けられたメソッドは、すべての組織データにアクセスできます。
これは正解です。クラスレベルでの@isTest(SeeAllData=true)が設定されている場合、メソッドレベルでの@isTest(SeeAllData=false)は無視され、そのメソッドはすべての組織データにアクセスできます。

□ テストメソッドを含むクラスは、@isTestアノテーションの有無に関係なく、Apexコードの制限にカウントされます。
これは不正解です。@isTestアノテーションが付けられたクラスは、Apexコードの制限にカウントされません。

□ クラスが@isTest(SeeAllData=false)で付けられている場合でも、テスト内で製品と価格表は表示されます。
これは不正解です。@isTest(SeeAllData=false)が指定されている場合、テストメソッドは組織の実データにアクセスできないようになります。製品と価格表も例外ではありません。

□ クラスが@isTest(SeeAllData=false)で付けられている場合でも、テスト内でプロファイルは表示されます。
これは正解です。@isTest(SeeAllData=false)が指定されている場合でも、一部のオブジェクト(例:UserやProfile)は例外としてアクセス可能です。

実践

正解の選択肢が正しいことを実環境で試してみましょう。

□ @isTest(SeeAllData=false)が付けられたクラス内の@isTest(SeeAllData=true)が付けられたメソッドは、すべての組織データにアクセスできます。

  • TestClassWithDataAccess
    • 説明: クラスレベルでSeeAllData=falseが設定されていますが、メソッドレベルでSeeAllData=trueが設定されたtestMethodWithAccessToAllDataメソッドは組織のデータにアクセスできるべきです。
    • 期待される結果: testMethodWithAccessToAllDataメソッドが実行された後、Salesforceの開発者コンソールのLogsタブでStatusが「成功」と表示されれば、@isTest(SeeAllData=true)が付けられたメソッドレベルのアノテーションがクラスレベルの@isTest(SeeAllData=false)アノテーションを上書きしていることが証明されます。
@isTest(SeeAllData=false)
private class TestClassWithDataAccess {

    @isTest(SeeAllData=true)
    static void testMethodWithAccessToAllData() {
        // このテストメソッドは組織のすべてのデータにアクセス可能です
        // テストを行うロジックをここに書きます
        // 例: Accountのクエリを行う
        List<Account> accounts = [SELECT Id, Name FROM Account];
        System.assertEquals(true, accounts.size() > 0, '組織のデータにアクセスできません');
    }

    @isTest
    static void testMethodWithoutAccessToAllData() {
        // このテストメソッドは組織のデータにアクセスできません
        // テストを行うロジックをここに書きます
        // 例: Accountのクエリを行い、何も取得できないことを確認
        List<Account> accounts = [SELECT Id, Name FROM Account];
        System.assertEquals(true, accounts.isEmpty(), '組織のデータにアクセスしてはいけません');
    }
}

□ @isTest(SeeAllData=true)が付けられたクラス内の@isTest(SeeAllData=false)が付けられたメソッドは、すべての組織データにアクセスできます。

  • TestSeeAllDataTrueClass
    • 説明: クラスレベルで @isTest(SeeAllData=true) が設定されているため、このクラス内のすべてのメソッドはデフォルトで組織のすべてのデータにアクセス可能です。メソッドレベルで @isTest(SeeAllData=false) を設定しても、この設定はクラスレベルの設定によって上書きされます。
    • 期待される結果: testMethodWithSeeAllDataFalse メソッドが実行された後、Salesforce の開発者コンソールの Logs タブで Status が「成功」と表示されれば、メソッドは組織のデータにアクセスできていることが証明されます。このことは、クラスレベルの @isTest(SeeAllData=true) アノテーションがメソッドレベルの @isTest(SeeAllData=false) アノテーションを上書きしていることを意味します。
@isTest(SeeAllData=true)
private class TestSeeAllDataTrueClass {

    @isTest(SeeAllData=false)
    static void testMethodWithSeeAllDataFalse() {
        // このメソッドはクラスレベルで@isTest(SeeAllData=true)が設定されているため、
        // このSeeAllData=falseは無視され、組織の全データにアクセス可能です。

        // 実際にデータにアクセスしてみるテストコード
        List<Account> accounts = [SELECT Id, Name FROM Account];
        System.assertNotEquals(0, accounts.size(), 'データにアクセスできませんでした。');
    }
}

□ クラスが@isTest(SeeAllData=false)で付けられている場合でも、テスト内でプロファイルは表示されます。

  • TestProfileAccess
    • 説明: クラスレベルで @isTest(SeeAllData=false) が設定されていますが、プロファイルはテストクラスでもアクセス可能なメタデータです。testProfileAccess メソッドは、SeeAllData=false が適用されているにもかかわらず、プロファイルデータにアクセスできることを検証します。
    • 期待される結果: testProfileAccess メソッドが実行された後、Salesforce の開発者コンソールの Logs タブで Status が「成功」と表示されれば、テストメソッドがプロファイルに正常にアクセスし、取得したことが確認できます。SeeAllData=false の設定があっても、プロファイルの取得が可能であることが証明されます。
@isTest(SeeAllData=false)
private class TestProfileAccess {

    @isTest
    static void testProfileAccess() {
        // プロファイルを取得するクエリ
        Profile standardProfile = [SELECT Id FROM Profile WHERE Name='標準ユーザー' LIMIT 1];

        // プロファイルが取得できることを検証
        System.assertNotEquals(null, standardProfile, 'プロファイルは取得できるはずです');

        // ここで他のアサーションを追加することも可能です。
    }
}

次の問題へ

前の問題へ

1問目から復習する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

コメント

コメントする

目次