Fork me on GitHub

SalesforceClient Sample

Fixture

概要

Fixtureを使用するとYAMLで定義した設定内容を元にSalesforceオブジェクトを更新(新規作成)したり削除したりすることができます。

テストの際に任意のレコードを更新しては元に戻し、ということを繰り返し行わなければならない場合に非常に重宝します。

Fixtureの機能は単純なSalesfoceオブジェクトの更新/削除の組み合わせなので、そのソースコード自体がSalesforceClientの使い方のサンプルとして参考になるかもしれません。

YAML定義の方法

まずはデータ定義に使用するYAMLのサンプルを以下に示します。

カレンダー有効化:
  $desc: 創立記念日を有効にする
  $key: Name=創立記念日
  $object: Calendar__c
  HolidayType__c: 祝日
  HolidayDt__c: 2013-09-01
  DisableFlg__c: false

カレンダー無効化:
  $desc: 創立記念日を無効にする
  $key: Name=創立記念日
  $object: Calendar__c
  HolidayType__c: 祝日
  HolidayDt__c: 2013-09-01
  DisableFlg__c: true

上の例では休日を登録するカレンダーにテスト用の休日を登録することを想定しています。

二つの定義の差異は「DisableFlg__c(無効フラグ)」のtrue/falseのみです。

定義はYAMLのハッシュで行いそれぞれの意味は以下の通りです。

項目名 必須 説明
[トップレベル] この定義の名前です。
$object 更新対象のオブジェクト名です。
$key 更新対象のオブジェクトを特定するための条件です。
項目名=値という形式で指定します。(指定できる項目は1フィールドのみです。)
$desc
または
$description
  任意の説明です。
$delete   この定義が削除可能かどうかを示します。省略時はtrueになります。
その他の「$」で始まる項目名   任意のプロパティです。プログラムから自由に利用することができます。
「$」以外で始まる項目名   オブジェクトのフィールド名と値を指定します。
  • $keyで指定する値にはクォートは不要です。
  • $keyで指定するフィールドは自動的に更新項目に含まれます。
  • $keyで指定するフィールドが外部ID項目である必要はありません。

Fixtureの読み込み

FixtureLoaderクラスでファイルからFixtureのListとして読み込むことができます。

File f = new File("MyTestdata.yml");
FixtureLoadeer loader = new FixtureLoader();
List<Fixture> list = loader.load(f);

$objectや$keyが定義されていないなど設定に不備がある場合はIOExceptionとなります。

Fixtureの実行

Fixtureの実行はFixtureRunnerクラスで行います。

コンストラクタの引数はログイン済みのSalesforceClientです。

このクラスにはupdateとdeleteという二つのメソッドがあり、それぞれFixture定義にしたがったレコードの更新(新規作成)と削除を実行します。

List<Fixture> list;
SalesforceClient client;
FixtureRunner runner = new FixtureRunner(client);

runner.setCacheId(true);//レコードのIDをキャッシュするかどうかの設定
                        //falseの場合は更新/削除の前に常に$keyの定義から生成したクエリを発行してレコードを特定しますが、
                        //trueの場合は1度実行したFixtureのIDをキャッシュするので同じオブジェクトを繰り返し更新する場合には
                        //パフォーマンスが向上します。

Fixture fx1 = list.get(0);
Fixutre fx2 = list.get(1);
if (ruuner.update(fx1)) { //データ更新 - 成功時にはtrueが返ります。
	System.out.println(fx1.getName() + "のデータを更新しました。");
}
if (ruuner.delete(fx2)) { //データ削除 - 成功時にはtrueが返ります。
	System.out.println(fx1.getName() + "のデータを削除しました。");
}