如何在没有公共构造函数的情况下模拟/伪造/存根密封OracleException?

时间:2020-03-06 14:36:37  来源:igfitidea点击:

在我的测试中,我需要测试引发OracleException时发生的情况(由于存储过程失败)。我正在尝试将Rhino Mocks设置为

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

但是,无论出于何种原因,OracleException似乎都没有公共构造函数而被密封。我可以做些什么来测试呢?

编辑:这正是我要实例化的内容:

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

解决方案

我们是否可以编写一个琐碎的存储过程,该过程每次都会失败/出错,然后使用该存储过程进行测试?

使用反射来实例化OracleException对象?代替

new OracleException()

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

使用反射实例化OracleException。查看此博客文章

这是操作方式:

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

多亏了所有这些帮助,我们才被提升

好的解决方案,乔治。这也适用于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 } );

-戴夫

我正在使用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的客户端库。

谢谢,

查理