Newer Version Available
非公開テストクラスメンバーへのアクセス
テストメソッドは、このメソッドがテストするクラスとは別に、テストクラスで定義されます。このことにより、テストメソッドから非公開クラスメンバー変数へのアクセスが必要な場合、または非公開メソッドをコールする場合に問題が生じる可能性があります。これらは非公開であるため、テストクラスからは参照できません。自分のクラスのコードを変更して、非公開クラスメンバーを利用できるようにする公開メソッドを公開するか、または、単に、これらの非公開クラスメンバーに TestVisible を使用してアノテーションを付加することができます。非公開または保護メンバーにこのアノテーションを付加すると、テストメソッドから、および、テストコンテキストで実行されているコードのみからこれらのメンバーにアクセスできます。
次の例に、非公開メンバー変数、コンストラクタがある非公開内部クラス、非公開メソッド、および非公開カスタム例外での TestVisible の使用法を示します。TestVisible アノテーションが付加されているため、これらはすべてテストクラスでアクセスできます。クラスに続いて、テストメソッドを含むテストクラスを示します。
1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class VisibleSampleClass {
18 // Private member variables
19 @TestVisible private Integer recordNumber = 0;
20 @TestVisible private String areaCode = '(415)';
21 // Public member variable
22 public Integer maxRecords = 1000;
23
24 // Private inner class
25 @TestVisible class Employee {
26 String fullName;
27 String phone;
28
29 // Constructor
30 @TestVisible Employee(String s, String ph) {
31 fullName = s;
32 phone = ph;
33 }
34 }
35
36 // Private method
37 @TestVisible private String privateMethod(Employee e) {
38 System.debug('I am private.');
39 recordNumber++;
40 String phone = areaCode + ' ' + e.phone;
41 String s = e.fullName + '\'s phone number is ' + phone;
42 System.debug(s);
43 return s;
44 }
45
46 // Public method
47 public void publicMethod() {
48 maxRecords++;
49 System.debug('I am public.');
50 }
51
52 // Private custom exception class
53 @TestVisible private class MyException extends Exception {}
54}1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// Test class for VisibleSampleClass
18@isTest
19private class VisibleSampleClassTest {
20
21 // This test method can access private members of another class
22 // that are annotated with @TestVisible.
23 static testmethod void test1() {
24 VisibleSampleClass sample = new VisibleSampleClass ();
25
26 // Access private data members and update their values
27 sample.recordNumber = 100;
28 sample.areaCode = '(510)';
29
30 // Access private inner class
31 VisibleSampleClass.Employee emp =
32 new VisibleSampleClass.Employee('Joe Smith', '555-1212');
33
34 // Call private method
35 String s = sample.privateMethod(emp);
36
37 // Verify result
38 System.assert(
39 s.contains('(510)') &&
40 s.contains('Joe Smith') &&
41 s.contains('555-1212'));
42 }
43
44 // This test method can throw private exception defined in another class
45 static testmethod void test2() {
46 // Throw private exception.
47 try {
48 throw new VisibleSampleClass.MyException('Thrown from a test.');
49 } catch(VisibleSampleClass.MyException e) {
50 // Handle exception
51 }
52 }
53
54 static testmethod void test3() {
55 // Access public method.
56 // No @TestVisible is used.
57 VisibleSampleClass sample = new VisibleSampleClass ();
58 sample.publicMethod();
59 }
60
61}この TestVisible アノテーションは、テストコードと非テストコードが混在する既存のクラスの Salesforce API バージョンをアップグレードする場合にも便利です。API バージョン 28.0 以降ではテストメソッドが非テストクラスで使用できなくなるため、クラスの API バージョンをアップグレードする場合に、古いクラスから��しいクラス (isTest アノテーションが付加されたクラス) にテストメソッドを移動する必要があります。元のクラスの非公開メソッドまたはメンバー変数にアクセスするときに、表示に関する問題が生じる場合があります。この場合は、これらの非公開メンバーに TestVisible アノテーションを付加します。