本当にこれでいいのか正直自信がないのですが、他の人の意見も聞いてみたいので、私の普段のやり方を投稿してみます。
基本的に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使うべきではないとか、そういうコードのカバーはあきらめる等)があればご意見いただけると幸いです。