[Apex]トリガーのインサートエラーのテストコードを書く
言われてみれば当たり前なんですが、メモ。
レコードがインサートされた際にデータ内容をチェックして、間違っていればエラーを返す、というトリガーを作成した。
要するに、自前のバリデーションチェックみたいなもの。
このテストコードを書いた際に、そのエラー部分も通るように作ってしまうと、テストコード自体がエラーになってしまってチェック出来なかった。
で、解決策としては単純で、try〜catch
を使う。
以下、例。
apex
1 2 3 4 5 6 7 8 |
|
姓に、test
という文字列の使用をエラーとするトリガーです。
テストコード
以下にようにそのままテストコードを書いてみます。
1 2 3 4 5 6 7 8 9 10 |
|
すると、以下のようなエラーが出てしまい、テストコードが実行できません。
18:14:44:833 FATAL_ERROR System.DmlException: Insert failed. First exception on row 0; first error: FIELD_CUSTOM_VALIDATION_EXCEPTION, testという名前は使えません: []
なので、insert
する部分をtry-catch
で例外をキャッチするようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
これでエラーで止まらなくなるので実行は出来るようになります。
catchの部分は今回で言えば、DmlException
なので、それでもよいですが、より広いエラーで、Exception
にしています。
この辺はあまり深く追求してません。。
で、これだとテストは通りますが、テストの意味はあまりないと思うので、意図したエラーが返ってくるかを確認するために、以下のように変更します。
try-catch
部分
1 2 3 4 5 6 |
|
これで指定したエラーが返ってきたかどうかがチェックできます。
もし指定したエラー以外のものが返ってきた場合は以下のようなエラーが出てテストコードが実行できなくなってしまうので間違いに気付くことが出来ます。
System.AssertException: Assertion Failed: Expected: false, Actual: true
(e.getMessage()
は、 System.DmlException:〜の文言を含んだ内容となるので、contains
関数で指定の文字列が含まれているかどうかをチェックしている。)
参考
How do I test for an exception(‘addError’) in a Trigger ? – Salesforce Developer Community