11

私のテストでは、(ストアド プロシージャの失敗により) OracleException がスローされたときに何が起こるかをテストする必要があります。Rhino Mocks をセットアップしようとしています

Expect.Call(....).Throw(new OracleException());

ただし、何らかの理由で、OracleException は public コンストラクターなしで封印されているようです。これをテストするにはどうすればよいですか?

編集:これがまさに私がインスタンス化しようとしているものです:

public sealed class OracleException : DbException {
  private OracleException(string message, int code) { ...}
}
4

9 に答える 9

8

オラクルのマネージド データ アクセス (v 4.121.1.0) では、コンストラクターが再び変更されました。

var ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(int), typeof(string), typeof(string), typeof(string) }, null);
var c = (OracleException)ci.Invoke(new object[] { 1234, "", "", "" });
于 2014-10-09T22:22:20.257 に答える
6

方法は次のとおりです。

    ConstructorInfo ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {typeof(string), typeof(int)}, null);
    var c = (OracleException)ci.Invoke(new object[] { "some message", 123 });

助けてくれたすべてのおかげで、あなたは賛成票を投じられました

于 2008-09-23T17:30:04.297 に答える
4

Oracle.DataAccess.Clientデータプロバイダークライアントを使用しています。OracleExceptionオブジェクトの新しいインスタンスを作成するのに問題がありますが、パブリックコンストラクタがないことを通知し続けます。上記のすべてのアイデアを試しましたが、null参照例外が発生し続けました。

object[] args = { 1, "Test Message" };
ConstructorInfo ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic 
     | BindingFlags.Instance, null, System.Type.GetTypeArray(args), null);
var e = (OracleException)ci.Invoke(args);

テストコードをデバッグするとき、「ci」の値は常にNULLになります。

Oracleはこれを許可しないようにライブラリを変更しましたか?NMockで使用するOracleExceptionオブジェクトをインスタンス化するには、何が間違っているのでしょうか。また、何をする必要がありますか。

ちなみに、私はバージョン10gのクライアントライブラリを使用しています。

ありがとう、

チャーリー

于 2010-07-01T17:10:09.947 に答える
4

リフレクションを使用して OracleException をインスタンス化します。このブログ投稿を参照してください

于 2008-09-23T16:48:01.027 に答える
4

Oracle は後のバージョンでコンストラクターを変更したようです。したがって、上記の解決策は機能しません。

エラー コードのみを設定する場合は、次のように 2.111.7.20 のトリックを行います。

ConstructorInfo ci = typeof(OracleException)
            .GetConstructor(
                BindingFlags.NonPublic | BindingFlags.Instance, 
                null, 
                new Type[] { typeof(int) }, 
                null
                );

Exception ex = (OracleException)ci.Invoke(new object[] { 3113 });
于 2011-05-06T08:03:01.007 に答える
3

リフレクションを使用して OracleException オブジェクトをインスタンス化しますか? 交換

new OracleException()

object[] args = ... ;
(OracleException)Activator.CreateInstance(typeof(OracleException), args)
于 2008-09-23T16:45:36.323 に答える
2

良い解決策ジョージ。これは SqlException でも機能します。

        ConstructorInfo ci = typeof( SqlErrorCollection ).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {  }, null );
        SqlErrorCollection errorCollection = (SqlErrorCollection) ci.Invoke(new object[]{});

        ci = typeof( SqlException ).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof( string ), typeof( SqlErrorCollection ) }, null );
        return (SqlException) ci.Invoke( new object[] { "some message", errorCollection } );

-デイブ

于 2009-06-17T03:22:46.660 に答える
-1

毎回失敗/エラーする単純なストアド プロシージャを作成し、それを使用してテストできますか?

于 2008-09-23T16:44:49.507 に答える