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