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