It was using postsharp, IIRC.

Tuna Toksöz
Eternal sunshine of the open source mind.

http://devlicio.us/blogs/tuna_toksoz
http://tunatoksoz.com
http://twitter.com/tehlike




On Sun, Apr 19, 2009 at 5:41 PM, Jonathon Rossi <[email protected]> wrote:

> That would be nice, but I am not aware of any way this is possible with the
> CLR, unless you change the IL of the actual class you want to proxy (e.g.
> PostSharp).
>
>
> On Mon, Apr 20, 2009 at 12:10 AM, Tim Barcz <[email protected]> wrote:
>
>> I've heard, I think (I could be crazy), that future releases of
>> DynamicProxy won't require virtual.  This was discussion point in an
>> NHibernate discussion I was having at one point.
>>
>> Tim
>>
>>
>> On Sun, Apr 19, 2009 at 8:04 AM, Kenneth <[email protected]> wrote:
>>
>>>
>>> Tim,
>>>
>>> Given another thought, I found a variation of adapter approach. With
>>> the help of an internal variable, I was able to test using RhinoMocks
>>> (see code below). But I still wish I can directly Mock the interface
>>> methods regardless of the virtual declaration of the implementation. I
>>> know Spring.Net proxy is able to do this, never used Castle so I
>>> cannot say for that. Maybe I'll take a look at the RhinoMocks souce
>>> code when I have some time to spend. :)  Thanks again!
>>>
>>> Cheers,
>>> Kenneth
>>>
>>>        public class MyClass : DoNotOwn, IDoNotOwn {
>>>             internal IDoNotOwn self;
>>>
>>>            public MyClass() {
>>>                self = this;
>>>             }
>>>
>>>            public new int Outer(int y) {
>>>                 return self.DirtyWork(y * y);
>>>             }
>>>        }
>>>
>>>        [Test] public void UsingRhinoMocks() {
>>>            const int workResult = 293848;
>>>            MockRepository mockery = new MockRepository();
>>>             var o = new MyClass {self = mockery.CreateMock<IDoNotOwn>
>>> ()};
>>>            Expect.Call(o.self.DirtyWork(4)).Return(workResult);
>>>             mockery.ReplayAll();
>>>            Assert.That(o.Outer(2), Is.EqualTo(workResult));
>>>            mockery.VerifyAll();
>>>        }
>>>
>>>
>>> On Apr 18, 7:33 pm, Kenneth <[email protected]> wrote:
>>> > Thanks Tim. That's exactly what I mean. It is the non-virtual method.
>>> > I don't know if you get a chance to look at my real world code. My
>>> > class is inheriting from Spring.Net's AdoTemplate, which has over 100
>>> > of overloaded methods that I need to adapter. And further I need to
>>> > write over 100 test cases for those adapting methods.
>>> >
>>> > I often rewrite my code when I found it becomes difficult to test and
>>> > the result was mostly a better design. But not this time. I was able
>>> > to write a Stub my self to complete the test, you can see the solution
>>> > using my own Stub instead of Rhino Mocks.
>>> >
>>> > The solution for the fiction code using my own Stub is provided in my
>>> > blog post, let me include it here and I believe Rhino Mocks should (if
>>> > not now, theoretically can in future :)) be able to do the same. See
>>> > the MyClassStub and the test below.
>>> >
>>> >         [Test] public void UsingMyStub() {
>>> >             const int workResult = 293848;
>>> >             MyClassStub stub = new MyClassStub();
>>> >             IDoNotOwn o = stub.ExpectCallDirtyWork(4).WillReturn
>>> > (workResult);
>>> >             Assert.That(o.Outer(2), Is.EqualTo(workResult));
>>> >             stub.VerifyAll();
>>> >         }
>>> >
>>> >         private class MyClassStub : MyClass, IDoNotOwn {
>>> >             private int _expectedI, _returnValue;
>>> >             private bool _isCalled;
>>> >             internal MyClassStub ExpectCallDirtyWork(int i) {
>>> >                 _expectedI = i; return this;
>>> >             }
>>> >
>>> >             internal MyClassStub WillReturn(int value) {
>>> >                 _returnValue = value; return this;
>>> >             }
>>> >
>>> >             internal void VerifyAll() {
>>> >                 Assert.IsTrue(_isCalled, "Call to DirtyWork was not
>>> > made.");
>>> >             }
>>> >
>>> >             public new int DirtyWork(int i) {
>>> >                 Assert.That(i, Is.EqualTo(_expectedI));
>>> >                 Assert.IsFalse(_isCalled, "Duplicated call to
>>> > DirtyWork.");
>>> >                 _isCalled = true;
>>> >                 return _returnValue;
>>> >             }
>>> >         }
>>> >
>>> > Kenneth
>>> >
>>> > On Apr 18, 6:35 pm, Tim Barcz <[email protected]> wrote:
>>> >
>>> > > I believe if it's not virtual you're in trouble.
>>> >
>>> > > Can you try adapting your code with the adapter pattern (see what I
>>> did
>>> > > there? :-)) and then you can mock...
>>> >
>>> > > Tim
>>> >
>>> > > On Sat, Apr 18, 2009 at 4:22 PM, Kenneth <[email protected]> wrote:
>>> >
>>> > > > Hello,
>>> >
>>> > > > I got stuck trying to mock the non-virtual implementation of
>>> interface
>>> > > > method. Here is a fiction code:
>>> > > >    public interface IDoNotOwn {
>>> > > >        int DirtyWork(int x);
>>> > > >        int Outer(int y);
>>> > > >    }
>>> >
>>> > > >    public class DoNotOwn : IDoNotOwn {
>>> > > >        public int DirtyWork(int x) {
>>> > > >            // do something that hard for unit test to setup.
>>> > > >            throw new Exception("Don't call me in unit test");
>>> > > >        }
>>> >
>>> > > >        public int Outer(int y) {
>>> > > >            return DirtyWork(y + y);
>>> > > >        }
>>> > > >    }
>>> >
>>> > > >    public class MyClass : DoNotOwn, IDoNotOwn {
>>> > > >        public new int Outer(int y) {
>>> > > >            return ((IDoNotOwn)this).DirtyWork(y*y);
>>> > > >        }
>>> > > >    }
>>> >
>>> > > >    [TestFixture] public class MyClassTest {
>>> > > >        [Test] public void UsingRhinoMocks() {
>>> > > >            const int workResult = 293848;
>>> > > >            MockRepository mockery = new MockRepository();
>>> > > >            IDoNotOwn o = mockery.CreateMock<MyClass>();
>>> > > >            Expect.Call(o.DirtyWork(4)).Return(workResult);
>>> > > >            mockery.ReplayAll();
>>> > > >            Assert.That(o.Outer(2), Is.EqualTo(workResult));
>>> > > >            mockery.VerifyAll();
>>> > > >        }
>>> > > >    }
>>> >
>>> > > > That doesn't work. It didn't generate the mock method and call
>>> right
>>> > > > into the real DirtyWork. I have also tried MultiMock with interface
>>> > > > and etc. Couldn't get it to work. For more detail, you can see it
>>> at
>>> >
>>> > > >
>>> http://kennethxu.blogspot.com/2009/04/rhino-mocks-strikes-to-mock-non...
>>> >
>>> > > > And I have a real word test case that now I wrote my own stub
>>> class:
>>> > > > The test case:
>>> >
>>> > > >
>>> http://code.google.com/p/kennethxublogsource/source/browse/trunk/Spri...
>>> >
>>> > > > And the code to be tested:
>>> >
>>> > > >
>>> http://code.google.com/p/kennethxublogsource/source/browse/trunk/Spri...
>>> >
>>> > > > Thanks,
>>> > > > Kenneth
>>>
>>>
>>>
>>
>>
>>
>
>
> --
> Jono
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Rhino.Mocks" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/RhinoMocks?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to