問題
@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=false | SeeAllData=true | アクセス可 | メソッドレベルでの設定がクラスレベルを上書きする |
SeeAllData=false | (設定なし) | アクセス不可 | クラスレベルの設定が適用される |
SeeAllData=true | SeeAllData=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, 'プロファイルは取得できるはずです');
// ここで他のアサーションを追加することも可能です。
}
}
コメント