編集以前の投稿はまったく役に立ちませんでした。これが 2 回目の試みです。これでモックのいくつかの要素を実行したい場合もありますが、コードを確認する必要はありませんが、このアプローチのどの要素が機能し、どの要素が機能しないかはわかりません。とにかく、一般的にキャッチブロックまたは例外をテストしようとするときに私がとるアプローチは次のとおりです。
public class A
{
public void ExecuteDB2Query(string query, DB2Connection connection)
{
try
{
// Code for executing the DB2 query
}
catch(DB2Exception ex)
{
// Catch block you are trying to test
}
}
// Actual method
public void MyMethod()
{
var query = "Select * FROM TableInApplication";
var connection = new DB2Connection("DATABASE=GOODDB");
ExecuteDB2Query(query, connection);
}
}
[Test]
public void MyMethod_CallsExecutDB2Query()
{
// Test that MyMethod is calling ExecuteDB2Query
}
// Intentionally pass it bad data to test your catch block
// under the notion that the code that executes in the application
// will be using the same method and thus the same catch block
[Test]
public void ExecuteDB2Query_Handles_Exception()
{
var queryString = "Select* FROM NonExistentTable";
var connection = new DB2Connection("DATABASE=BADDB");
var aClass = new A();
Assert.Throws<DB2Exception>(() => aClass.ExecuteDB2Query(queryString, connection));
}
これはこれを処理する最もエレガントな方法ではありませんが、例外をスタブ化できない場合は、コードの責任を分割し、例外をトリガーして各部分を個別にテストすることが、次善の策だと思います。