如何在没有公共构造函数的情况下模拟/伪造/存根密封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的客户端库。
谢谢,
查理