テストメソッドがアクセスできるデータが変わりました
Spring '12でリリースされたAPI 24.0以降では、テストメソッドは、テストメソッドが作成したデータのみにアクセスできるようになりました。
API 23.0(Winter '12)以前は、テストメソッドは組織の全てのデータにアクセスできたので、大きな変更点です。
これまでも、「既存データに依存するテストコードを書いてしまうと、テスト実行時点のデータの状態によって、テストの結果が変ってしまう」という問題がありました。
そのため、テストメソッド内でデータを作成して、そのデータを使ってテストする方法が推奨されていましたが、API 23.0以前では、テストメソッドは組織の全てのデータにアクセスできたので、既存データに依存するテストコードを書くことができてしまいました。
API 24.0以降を使えば、度々見かけるこの問題が生じることはなく、テストコードの品質を高めることができそうです。
○API 23.0以前の挙動
API 23.0 以前のテストコードは、引き続き、組織の全てのデータにアクセスすることができます。Spring '12のリリースが原因で、今まで動作していたテストコードが動作しなくなることはありません。
○API 24.0以降で、組織の全てのデータにアクセスしたい場合
API 24.0以降でも、↓のように「IsTest(SeeAllData=true) アノテーション」を使用することで、組織の全てのデータにアクセスすることができます。
@isTest
private class HogeControllerTest {
@isTest(SeeAllData=true)
static void testMethod1() {
// 組織の全てのデータにアクセス可能
}
}
○API 24.0以降で、常にアクセス可能なデータ
組織またはメタデータオブジェクトの管理に使用する次のオブジェクトは、そのままテストでアクセスできます。
・User
・Profile
・Organization
・RecordType
・ApexClass
・ApexTrigger
・ApexComponent
・ApexPage
IsTest(SeeAllData=True)アノテーションを付けないと、データにアクセスできないので下記エラーが表示されます。
List has no rows for assignment to sobject but the object has records
エラーメッセージを頼りに調査していたので、はまってました。
投稿: Tomo | 2012年10月22日 (月) 07:26
たしかに、API24.0以降でアノテーション付けてないと、原因が分からず、ハマりやすいですよね。
投稿: tama | 2012年10月22日 (月) 15:07