Wie kann ich verspotten / Fälschung / Stub versiegelt OracleException ohne öffentlichen Konstruktor?

StackOverflow https://stackoverflow.com/questions/122215

Frage

In meinen Tests muss ich testen, was passiert, wenn ein OracleException geworfen wird (aufgrund einer gespeicherten Prozedur Fehler). Ich versuche, Setup Rhino Mocks zu

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

Aus irgendeinem Grund scheint jedoch OracleException ohne öffentlichen Konstruktor abgedichtet werden. Was kann ich tun, um dies zu testen?

Edit: Hier genau ist, was ich versuche zu instanziieren:

public sealed class OracleException : DbException {
  private OracleException(string message, int code) { ...}
}
War es hilfreich?

Lösung

Es scheint, dass Oracle ihre Konstrukteure in späteren Versionen geändert, damit über die Lösung wird nicht funktionieren.

Wenn Sie nur den Fehlercode gesetzt werden soll, wird die folgende den Trick für 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 });

Andere Tipps

Für Oracle verwalteten Datenzugriff (v 4.121.1.0) der Konstruktor geändert wieder

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, "", "", "" });

Hier ist, wie Sie es tun:

    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 });

Danke an alle, die dazu beigetragen haben Sie upvoted worden

Ich bin mit dem Oracle.DataAccess.Client Datenanbieter-Client. Ich habe Probleme eine neue Instanz eines OracleException Objekt konstruieren, aber es sagt mir, dass es keine öffentlichen Konstruktoren. Ich habe versucht, alle Ideen oben und halten gezeigt, die eine Null-Referenz Ausnahme bekommen.

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);

Wenn Sie den Code Test debuggen, habe ich immer einen Nullwert für 'ci' erhalten.

Hat Oracle die Bibliothek verändert nicht das zulassen? Was ich tue, falsch und was muß ich tun, um ein OracleException Objekt zu instanziiert mit NMock zu benutzen?

By the way, ich bin mit der Client-Bibliothek für die Version 10g.

Danke,

Charlie

Mit Reflexion instanziiert OracleException. Siehe dieses Blog-Post

Mit Reflexion instanziiert das OracleException Objekt? Ersetzen Sie

new OracleException()

mit

object[] args = ... ;
(OracleException)Activator.CreateInstance(typeof(OracleException), args)

Sie können immer alle Konstrukteure bekommen wie diese

ConstructorInfo[] all = typeof(OracleException).GetConstructors(
  BindingFlags.NonPublic | BindingFlags.Instance);`

Für Oracle.DataAccess 4.112.3.0 dies ergab 7 Konstrukteurs

Der, den ich war der zweite in der Liste wollte die 5 Argumente haben, int, string, string, string, int. Ich war von dem fünften Argumente überrascht, weil in ILSpy es so ausgesehen

internal OracleException(int errCode, string dataSrc, string procedure, string errMsg)
{
    this.m_errors = new OracleErrorCollection();
    this.m_errors.Add(new OracleError(errCode, dataSrc, procedure, errMsg));
}

Also, um den Konstruktor bekomme ich wollte ich am Ende mit

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

Gute Lösung George. Dies funktioniert auch für SqlException auch:

        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 } );

-Dave

Können Sie eine triviale gespeicherte Prozedur schreiben, die / Fehler jedes Mal ausfällt, dann verwenden, zu testen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top