Test Isolation Principle: Apex test methods run in a sandboxed environment without access to existing org data unlessseeAllData=trueis used. The test fails if it relies on data not created within the test itself. Why Not Other Options? A:runAssimulates user context but does not affect test isolation. B: @future methods do not cause failures if handled correctly. D: Syntax errors would prevent code compilation. References:Test Data Isolation:https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode /apex_testing_data.htm
最新のコメント (最新のコメントはトップにあります。)
正解は **C** です。
この現象は、Apexテストの最も基本的な原則である **「データ隔離 (Data Isolation)」** が原因で発生する典型的なシナリオです。
### 正解の解説
**C. テスト メソッドはサンドボックス内の既存のデータに依存します。**
* **匿名実行 (Execute Anonymous):**
* 組織にある **「本物のデータ(実データ)」** にアクセスして実行されます。
* したがって、Sandboxに存在する特定のレコード(例: 「株式会社テスト」)をクエリして処理するロジックは成功します。
* **テストランナー (Apex Test Framework):**
* デフォルトでは **「データが隔離された状態」** で実行されます。
* Sandboxにどれだけデータが入っていても、テストメソッドからはそれらのデータは **一切見えません**(0件として扱われます)。
* もしロジックが「既存のレコードを取得して更新する」ものだった場合、テスト環境では取得結果が空になり、予期せぬエラー(List index out of bounds や Null Pointer Exception、あるいはアサーション失敗)が発生して失敗します。
---
### 不正解の解説
**A. テスト メソッドは... system.runAs を使用しません。**
* `System.runAs` は「特定のユーザー権限」でテストを実行するためのものです。
* 匿名実行は「現在のユーザー(開発者)」で実行されます。テストもデフォルトでは「現在のユーザー」で実行されます。したがって、権限の問題が原因である可能性は低い(データが見えないことが主因)です。
**B. テスト メソッドは @future メソッドを呼び出しています。**
* `@future` メソッドはテスト内でも呼び出し可能です(`Test.startTest()` と `Test.stopTest()` で囲むことで同期的に実行させて検証します)。
* 単に呼び出しているだけで「失敗する」理由にはなりません。
**D. テスト メソッドのコードに構文エラーがあります。**
* 構文エラー(Syntax Error)がある場合、**保存(コンパイル)自体ができません**。テストを実行する以前の段階でエラーになるため、このシナリオには当てはまりません。
---
### 💡 解決策(ベストプラクティス)
この問題を解決するには、テストクラス内で必要なデータを **自分で作成する** 必要があります。
1. **`@testSetup` を使う:** テスト実行前に必要なデータ(AccountやContactなど)を Insert する。
2. **テスト...