كيف يمكنني وهمية/مزورة/كعب يختم OracleException مع أي العام منشئ ؟

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

سؤال

في بلدي التجارب أحتاج إلى اختبار ما يحدث عندما OracleException يتم طرح (بسبب إجراء مخزن الفشل).أنا أحاول أن الإعداد وحيد القرن يسخر إلى

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

لأي سبب من الأسباب ومع ذلك ، OracleException يبدو أن تكون مختومة مع أي منشئ العام.ماذا يمكنني أن أفعل من أجل اختبار هذا ؟

تحرير: هنا هو بالضبط ما أحاول مثيل:

public sealed class OracleException : DbException {
  private OracleException(string message, int code) { ...}
}
هل كانت مفيدة؟

المحلول

يبدو أن أوراكل تغير المنشئات في الإصدارات الأحدث ، وبالتالي الحل أعلاه لا تعمل.

إذا كنت فقط ترغب في تعيين رمز الخطأ التالية سوف تفعل خدعة 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 });

نصائح أخرى

Oracle نجح في الوصول إلى البيانات (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, "", "", "" });

هنا هو كيف يمكنك أن تفعل ذلك:

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

بفضل كل ذلك ساعد كنت upvoted

أنا باستخدام أوراكل.DataAccess.عميل موفر بيانات العميل.أواجه مشكلة في إنشاء مثيل جديد من OracleException كائن ، لكنه يقول لي أنه لا توجد العامة والمنشئات.حاولت كل الأفكار هو مبين أعلاه والحفاظ على الحصول على مرجع فارغة استثناء.

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'.

وقد أوراكل غيرت المكتبة لا تسمح بهذا ؟ ما الخطأ الذي فعلته و ما الذي يجب أن أفعله مثيل OracleException كائن إلى استخدام مع NMock?

بالمناسبة, أنا باستخدام مكتبة العميل الإصدار 10g.

شكرا

تشارلي

استخدام التفكير مثيل OracleException.انظر هذا بلوق وظيفة

استخدام التفكير مثيل OracleException الكائن ؟ محل

new OracleException()

مع

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

يمكنك دائما الحصول على جميع المنشئات مثل هذا

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

بالنسبة Oracle.DataAccess 4.112.3.0 هذا عاد 7 المنشئات

enter image description here

واحدة أردته هو الثاني في القائمة التي أخذت 5 الحجج ، int, string, string, string, int.فوجئت الخامسة حجة لأن في ILSpy بدا مثل هذا

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

لا منشئ أردت انتهت باستخدام

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

حل جيد جورج.هذا يعمل أيضا على 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 } );

-ديف

هل يمكنك كتابة تافهة الإجراء المخزن الذي فشل/الأخطاء في كل مرة ، ثم استخدام هذا الاختبار ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top