Salesforce 認定 Platform デベロッパー 無料問題 10 / 10 ・ 分野4: テスト、デバッグ、リリース
クラス PriceCalc には、外部のクラスに見せたくない private static のメソッド roundUp がある。テストクラスから roundUp を直接呼んで確かめたいが、本番のほかのクラスからは呼べないままにしたい。Apex 開発者ガイドに合う方法はどれか。
- テストクラスを PriceCalc の内部クラスとして書く。内部クラスからは private のメソッドを呼び、外からは見えない
- roundUp を protected に変えてから @TestVisible を付ける。@TestVisible は private のメンバーには付けられず、protected にすればほかのクラスからは呼べないまま保てる
- roundUp に @TestVisible を付ける。テストからは呼べ、ほかのクラスには private のまま見えない
- テストクラスの側に @TestVisible を付ける。付けたテストクラスは PriceCalc の private のメンバーを呼べるようになり、PriceCalc の宣言は変えずに済む
正解と解説を見る
正解: C
正解の理由
「TestVisible Annotation」は、@TestVisible を付けると、テストメソッドがテストクラスの外にあるクラスの private や protected のメンバー(メソッド・メンバー変数・内部クラス)にアクセスできると書いている。広がるのはテストを実行するときのアクセスだけで、テスト以外のクラスからのアクセスの範囲は変わらない。アクセス修飾子を public に変えずにテストで確かめるための注釈である。
違う選択肢
「roundUp を protected に変えてから @TestVisible を付ける。@TestVisible は private のメンバーには付けられず、protected にすればほかのクラスからは呼べないまま保てる」… @TestVisible は private のメンバーにも付けられる。ガイドは private と protected のメンバーをテストに見せる注釈だと書き、例でも private static の変数とメソッドにそのまま付けている。修飾子を変える必要は無い。
「テストクラスの側に @TestVisible を付ける。付けたテストクラスは PriceCalc の private のメンバーを呼べるようになり、PriceCalc の宣言は変えずに済む」… ガイドは、@TestVisible を、テストに見せたいメンバー(メソッド・メンバー変数・内部クラス)の定義に付けると書き、例でも private の変数とメソッドの定義に付けている。テストクラスの側に付けて、ほかのクラスの private のメンバーを開くものではない。
「テストクラスを PriceCalc の内部クラスとして書く。内部クラスからは private のメソッドを呼び、外からは見えない」… 「IsTest Annotation」は、@IsTest を付けたクラスは最上位のクラスでなければならないと書いている。テストクラスを PriceCalc の内部クラスとして書くことはできない。
押さえどころ
@TestVisible は「テストからの呼び出しだけを広げる」注釈で、本番のコードの設計(private のまま隠す)を崩さずにテストできる。@IsTest のクラスは private か public にでき、最上位のクラスに限られ、インターフェースや列挙型にはできない。