Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I mock/fake/stub sealed OracleException with no public constructor?

In my tests I need to test what happens when an OracleException is thrown (due to a stored procedure failure). I am trying to setup Rhino Mocks to

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

For whatever reason however, OracleException seems to be sealed with no public constructor. What can I do to test this?

Edit: Here is exactly what I'm trying to instantiate:

public sealed class OracleException : DbException {
  private OracleException(string message, int code) { ...}
}
like image 572
George Mauer Avatar asked Sep 23 '08 16:09

George Mauer


6 Answers

For oracle's managed data access (v 4.121.1.0) the constructor changed again

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, "", "", "" });
like image 139
Kingpin2k Avatar answered Oct 23 '22 03:10

Kingpin2k


Here is how you do it:

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

Thanks to all that helped, you have been upvoted

like image 23
George Mauer Avatar answered Oct 23 '22 04:10

George Mauer


It seems that Oracle changed their constructors in later versions, therefore the solution above will not work.

If you only want to set the error code, the following will do the trick for 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 });
like image 21
Morten Cools Avatar answered Oct 23 '22 03:10

Morten Cools


I'm using the Oracle.DataAccess.Client data provider client. I am having trouble constructing a new instance of an OracleException object, but it keeps telling me that there are no public constructors. I tried all of the ideas shown above and keep getting a null reference exception.

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

When debugging the test code, I always get a NULL value for 'ci'.

Has Oracle changed the library to not allow this? What am I doing wrong and what do I need to do to instantiate an OracleException object to use with NMock?

By the way, I'm using the Client library for version 10g.

Thanks,

Charlie

like image 4
Charles Crawford Avatar answered Oct 23 '22 05:10

Charles Crawford


Use reflection to instantiate OracleException. See this blog post

like image 4
Mauricio Scheffer Avatar answered Oct 23 '22 03:10

Mauricio Scheffer


Use reflection to instantiate the OracleException object? Replace

new OracleException()

with

object[] args = ... ;
(OracleException)Activator.CreateInstance(typeof(OracleException), args)
like image 3
Matt Howells Avatar answered Oct 23 '22 05:10

Matt Howells