runAs メソッドの使用
一般に、Apex コードはすべてシステムモードで実行され、現在のユーザーの権限やレコード共有は考慮されません。ユーザーのレコード共有を強制実行するために、システムメソッド runAs を使用して、コンテキストユーザーを既存のユーザーまたは新規ユーザーに変更するテストメソッドを作成できます。runAs メソッドは、レコード共有を適用します。新規のコンテキストユーザーには、ユーザー権限と項目レベル権限が適用されます。詳細は、「オブジェクト権限と項目権限の適用」を参照してください。
テストメソッドのみで runAs を使用できます。元のシステムコンテキストは、すべての runAs テストメソッドが完了した後で再開されます。
runAs メソッドは、ユーザーライセンスの制限を無視します。組織に追加ユーザーライセンスがない場合でも、runAs でユーザーを作成できます。
次の例では、新しいテストユーザーが作成され、コードがそのユーザーとして、ユーザーのレコード共有アクセス権を使用して実行されます。
1@isTest
2private class TestRunAs {
3 public static testMethod void testRunAs() {
4 // Setup test data
5 // Create a unique UserName
6 String uniqueUserName = 'standarduser' + DateTime.now().getTime() + '@testorg.com';
7 // This code runs as the system user
8 Profile p = [SELECT Id FROM Profile WHERE Name='Standard User'];
9 User u = new User(Alias = 'standt', Email='standarduser@testorg.com',
10 EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',
11 LocaleSidKey='en_US', ProfileId = p.Id,
12 TimeZoneSidKey='America/Los_Angeles',
13 UserName=uniqueUserName);
14
15 System.runAs(u) {
16 // The following code runs as user 'u'
17 System.debug('Current User: ' + UserInfo.getUserName());
18 System.debug('Current Profile: ' + UserInfo.getProfileId());
19 }
20 }
21}複数の runAs メソッドをネストできます。次に例を示します。
1@isTest
2private class TestRunAs2 {
3
4 public static testMethod void test2() {
5
6 Profile p = [SELECT Id FROM Profile WHERE Name='Standard User'];
7 User u2 = new User(Alias = 'newUser', Email='newuser@testorg.com',
8 EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',
9 LocaleSidKey='en_US', ProfileId = p.Id,
10 TimeZoneSidKey='America/Los_Angeles', UserName='newuser@testorg.com');
11
12 System.runAs(u2) {
13 // The following code runs as user u2.
14 System.debug('Current User: ' + UserInfo.getUserName());
15 System.debug('Current Profile: ' + UserInfo.getProfileId());
16
17 // The following code runs as user u3.
18 User u3 = [SELECT Id FROM User WHERE UserName='newuser@testorg.com'];
19 System.runAs(u3) {
20 System.debug('Current User: ' + UserInfo.getUserName());
21 System.debug('Current Profile: ' + UserInfo.getProfileId());
22 }
23
24 // Any additional code here would run as user u2.
25 }
26 }
27}runAs のその他の使用
DML 操作を runAs ブロックで囲むことで、runAs メソッドを使用して混合 DML 操作をテストで実行することもできます。この方法では、設定オブジェクトを他の sObject と一緒に挿入または更新しようとすると返される混合 DML エラーを回避できます。「DML 操作で同時に使用できない sObject」を参照してください。
パッケージバージョンを引数として取る、runAs メソッド (runAs(System.Version)) の別のオーバーロードがあります。このメソッドによって、管理パッケージの特定のバージョンのコードが使用されます。runAs メソッドの使用とパッケージバージョンコンテキストの指定についての詳細は、「パッケージバージョンの動作のテスト」を参照してください。