Sunday, April 3, 2011

Rhino Mocks: Mocked method returns null

I'm trying to mock a data repository object but after setting an expectation on my MockRepository, it returns null every time. My code is as follows:

    [Test]
    public void GetById_NotNull()
    {
        Person expectedPerson = new Person() { Id = 1, Name="Jon"};

        MockRepository MockRepository = new MockRepository();
        var FakePersonRepository = MockRepository.StrictMock<IRepository<Person>>();

        FakePersonRepository.Expect(action => action.Get(1)).IgnoreArguments().Return(expectedPerson);

        PersonService PersonService = new PersonService(FakePersonRepository);
        Person returnedPerson = PersonService.Get(1);

        Assert.IsNotNull(returnedPerson);
    }

    //and inside my person service
    public class PersonService
    {
         private IRepository<Person> _PersonRepository;
         public PersonService(IRepository<Person> PersonRepository)
         {
           this._PersonRepository = PersonRepository;
         }

         public Person Get(int Id)
         {
             Person p = _PersonRepository.Get(Id);
             return p;
          }
    }

The assertion at the bottom of the Test fails and returned person is always null. I know I must be doing something wrong with my mock....ideas?

From stackoverflow
  • Try doing a

    mockRepository.ReplayAll()
    

    after the line where you set your Expect.

  • I'm not super familiar with RhinoMocks (I've been using Moq), but couldn't:

    FakePersonRepository.Expect(action => action.Get(1)).IgnoreArguments().Return(expectedPerson);
    

    be

    FakePersonRepository.Expect(action => action.Get(1)).Return(expectedPerson);
    

    I also think you need a Replay() with RM.

    Dav Evans : Yeah the IgnoreArguments is superfluous. Its the replay I was missing.
  • As others have said, I believe you will need a Replay somewhere with the style of tests you are using; As an alternative, you could use the newer AAA Syntax along with the static MockRepository.GenerateMock<>()/MockRepository.GenerateStub<>() methods which would not require a Replay.

  • Chris is on the money here. The AAA syntax and using GenerateStub for this senario is best.

    var FakePersonRepository = MockRepository.GenerateStub<<IRepository<Person>>();
    FakePersonRepository.Stub(x => x.Get(1)).Returns(expectedPerson);
    
    PersonService PersonService = new PersonService(FakePersonRepository);
    Person returnedPerson = PersonService.Get(1);
    
  • With the AAA syntax and GenerateMock you can also verify that PersonRepository is called with the correct parameter and correct number of times:

    Person expectedPerson = new Person() { Id = 1, Name="Jon"}; 
    
    MockRepository MockRepository = new MockRepository(); 
    var FakePersonRepository = MockRepository.GenerateMock<IRepository<Person>>(); 
    
    FakePersonRepository.Expect(action => action.Get(1)).Return(expectedPerson).Repeat.Once(); 
    PersonService PersonService = new PersonService(FakePersonRepository); 
    Person returnedPerson = PersonService.Get(1); 
    
    Assert.IsNotNull(returnedPerson); 
    FakePersonRepository.VerifyAllExpectations();
    

0 comments:

Post a Comment