3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

apex try-catchブロックのテスト

Last updated at Posted at 2017-05-29

本当にこれでいいのか正直自信がないのですが、他の人の意見も聞いてみたいので、私の普段のやり方を投稿してみます。

基本的にApexでの開発の場合、try-catchしなくても、最低限のエラー情報はメールとかでとれるので、そんなガバガバとtry-catch入れる必要はないのかなぁと思ってるのですが、DML文の発行などでは、行ロックの可能性なんかを考えて、一応try-catchするようにしてます。
ただ、そういうtry-catchは、テストコードの中でExceptionを狙って出せないので、簡単にはカバーできません。

ではどうするのかというと、私の場合は以下のような方法で無理やり狙ったExceptionを発生させてカバーしてます。

public class pageController
  List<Account> accounts {get; set;}
  @testVisible private isDMLExceptionTest;

  public pageReference doSaveAll() {
    if(this.accounts != null && !this.accounts.isEmpty()) {
      try {
        update this.accounts;
        //テスト中に限り、強制的にDmlExceptionを発行させる
        if(Test.isRunningTest() && this.isDMLExceptionTest){
          insert new Account();
        }
      }
      catch(DmlException e) {
        ApexPages.addMessages(e);
        return null;
      }
    }
    return null;
  }
}

Test.isRunningTest()はテストコードの中での実行されているとき、trueになります。
これを、@testVisibleで修飾したprivateなメンバ変数とくみあわせ、Exceptionを発生させたいテストコードの中でフラグ立てをし、狙ったExceptionが発生する適当なコードを実行させて、無理やりExceptionをキャッチしてます。
一応、これでExceptionが発生した場合の挙動を再現できます。

ただ、本当はもっとスマートな方法があったりするんじゃないかといつも悩んでるので、もし良い解決方法(あるいは、そもそもそんな時はtry-catch使うべきではないとか、そういうコードのカバーはあきらめる等)があればご意見いただけると幸いです。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?