C#のユニットテストでスローされた例外を検証する2つの方法
C#の単体テスト(ユニットテスト)では、メソッドが正しく例外をスローすることを確認する場面がよくあります。MSTestフレームワークでは、主に次の2つの方法で例外を検証できます。
- Assert.ThrowsException を使用する方法
- ExpectedException属性 を使用する方法
テスト対象となるサンプルコード
ここでは、常に例外をスローする StringAppend メソッドを例に、その例外をテストする方法を見ていきましょう。
using System;
namespace DemoApplication {
public class Program {
static void Main(string[] args) {
}
public string StringAppend(string firstName, string lastName) {
throw new Exception("Test Exception");
}
}
}この StringAppend メソッドは、引数を受け取ると必ず「Test Exception」というメッセージを持つ Exception をスローします。これを2通りのアプローチでテストしてみます。
方法1:Assert.ThrowsExceptionを使う
まずは Assert.ThrowsException<T> を使う方法です。この方法では、例外の発生を直接キャッチして、例外の型やメッセージを細かくアサートできます。
using System;
using DemoApplication;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace DemoUnitTest {
[TestClass]
public class DemoUnitTest {
[TestMethod]
public void DemoMethod() {
Program program = new Program();
var ex = Assert.ThrowsException<Exception>(() => program.StringAppend("Michael", "Jackson"));
Assert.AreSame(ex.Message, "Test Exception");
}
}
}このテストコードでは、ラムダ式内で StringAppend メソッドを呼び出し、Assert.ThrowsException<Exception> によって期待どおりの例外がスローされることを検証しています。さらに、返された例外オブジェクトの Message プロパティが「Test Exception」と一致していることも Assert.AreSame で確認しているため、すべての条件が満たされればテストケースは成功します。
この方式のメリットは、例外の型だけでなくメッセージ内容まで明示的に検証できる点です。より厳密なテストを書きたい場合に適しています。
方法2:ExpectedException属性を使う
もう一つは、テストメソッドに [ExpectedException] 属性を付与する方法です。こちらは宣言的に期待する例外の型を指定します。
using System;
using DemoApplication;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace DemoUnitTest {
[TestClass]
public class DemoUnitTest {
[TestMethod]
[ExpectedException(typeof(Exception), "Test Exception")]
public void DemoMethod() {
Program program = new Program();
program.StringAppend("Michael", "Jackson");
}
}
}このテストでは、[ExpectedException(typeof(Exception), "Test Exception")] のように、期待する例外の型(とメッセージ)を属性として指定しています。StringAppend メソッドが同じ型の例外をスローすれば、テストケースは成功します。
ただし、この方式はコード量が少なく簡潔な反面、テストメソッド内のどの時点で例外が発生しても合格になってしまうため、意図しない箇所での例外発生を見逃す可能性があります。例外の発生位置まで厳密に検証したい場合は、Assert.ThrowsException を使う方法が推奨されます。
まとめ
- Assert.ThrowsException:例外の型・メッセージ・発生位置を柔軟かつ厳密に検証できる。
- ExpectedException属性:記述がシンプルだが、検証の粒度は粗くなる。
用途に応じて使い分けることで、例外処理の品質を効率的に担保できます。一般的には、より詳細な検証が可能な Assert.ThrowsException の使用が推奨されています。
-
私のウェブサイトはハッキングされていますか? Web サイトがハッキングされているかどうかを確認する方法
「私のウェブサイトはハッキングされたのではないか? 」 それとも、何かおかしいことに気づいたからといって、ただ心配しているだけですか?いずれにせよ、パニックにならないでください。問題を理解しようとすることで、あなたはすでに先を行っています。 毎週、Google は 20,000 を超える Web サイトをブラックリストに登録し、50,000 の Web サイトにマルウェアのフラグを立てています。このことを考えると、セキュリティ アラートによって頭痛の種が半減したかもしれません。 ただし、まず、MalCare で WordPress サイトをスキャンして、Web サイトがハッキン
-
Windowsで「このショートカットのリンク先が変更または移動されています」エラーを修正する6つの方法
Windowsでは、デスクトップ上のショートカットアイコンを使ってアプリケーションを素早く起動している方も多いでしょう。しかし、ある日ショートカットをクリックした際に「このショートカットのリンク先が変更または移動されているため、開けません」といったエラーメッセージが表示されることがあります。この問題の原因は何なのでしょうか?主な原因は以下のとおりです。 対象のソフトウェアが元のフォルダから移動された、または削除・破損している マルウェアやサードパーティ製アプリの不具合がPCに存在する システムファイルが破損または欠落している システム保護機能やセキュリティソフトによってパスがブロックされてい