[Apex]トリガーのインサートエラーのテストコードを書く

言われてみれば当たり前なんですが、メモ。

レコードがインサートされた際にデータ内容をチェックして、間違っていればエラーを返す、というトリガーを作成した。
要するに、自前のバリデーションチェックみたいなもの。
このテストコードを書いた際に、そのエラー部分も通るように作ってしまうと、テストコード自体がエラーになってしまってチェック出来なかった。

で、解決策としては単純で、try〜catchを使う。

以下、例。

apex

1
2
3
4
5
6
7
8
trigger SampleLeadTrigger on Lead (before insert) {
    for(Lead obj : Trigger.New){
        if(obj.LastName == 'test'){
            obj.addError('testという名前は使えません');
            continue;
        }
    }
}

姓に、testという文字列の使用をエラーとするトリガーです。

テストコード

以下にようにそのままテストコードを書いてみます。

1
2
3
4
5
6
7
8
9
10
@isTest
private class Test_SampleLeadTrigger {
    static testMethod void excute(){
        Lead test_obj = new Lead();
        test_obj.Company = 'hoge co.';
        test_obj.LastName = 'test';
        
        insert test_obj;
    }
}

すると、以下のようなエラーが出てしまい、テストコードが実行できません。

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
@isTest
private class Test_SampleLeadTrigger {
    static testMethod void excute(){
        Lead test_obj = new Lead();
        test_obj.Company = 'hoge co.';
        test_obj.LastName = 'test';
        
        try{
          insert test_obj;
        }catch(Exception e){
            
        }
    }
}

これでエラーで止まらなくなるので実行は出来るようになります。
catchの部分は今回で言えば、DmlExceptionなので、それでもよいですが、より広いエラーで、Exceptionにしています。
この辺はあまり深く追求してません。。

で、これだとテストは通りますが、テストの意味はあまりないと思うので、意図したエラーが返ってくるかを確認するために、以下のように変更します。

try-catch部分

1
2
3
4
5
6
try{
    insert test_obj;
}catch(Exception e){
    Boolean expectedExceptionThrown =  e.getMessage().contains('testという名前は使えません') ? true : false;
  System.AssertEquals(expectedExceptionThrown, true);
}

これで指定したエラーが返ってきたかどうかがチェックできます。
もし指定したエラー以外のものが返ってきた場合は以下のようなエラーが出てテストコードが実行できなくなってしまうので間違いに気付くことが出来ます。

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

   このエントリーをはてなブックマークに追加