Per chi sviluppa in TDD utilizzare i Mock Objects è una delle basi dell'interaction based testing.
Per facilitare questo compito sono disponibili alcune librerie in rete. Fino all'anno scorso ho utilizzato TypeMock, ora con l'anno nuovo ho voluto provare un'altra libreria ed ho scaricato Rhino Mocks.
Le prime impressioni sono positive in quanto l'object model mi sembra più chiaro rispetto a TypeMock. Ho avuto qualche difficoltà con in metodi che non ritornano valori (void).
Vediamo un esempio pratico:
Supponiamo di voler creare un mock object della seguente interfaccia:
public interface ICustomerList
{
void Add(Customer customer);
int Count { get;}
}
Il codice del test sarà:
[Test]
public void RhinoMocksSampleTest()
{
MockRepository mockRepository = new MockRepository();
ICustomerList customers = mockRepository.CreateMock<ICustomerList>();
Expect.Call(customers.Count).Return(10);
mockRepository.ReplayAll();
Assert.AreEqual(10, customers.Count);
mockRepository.VerifyAll();
}
Con la chiamata Expect.Call indichiamo che la prossima volta che viene letto il valore della property Count dell'interfaccia ICustomerList viene ritornato il valore 10. Un pò più complicato è invece il mock del metodo Add perchè non ritorna nessun valore e quindi non si può usare ExpectCall:
[Test]
public void RhinoMocksSampleTest()
{
MockRepository mockRepository = new MockRepository();
ICustomerList customers = mockRepository.CreateMock<ICustomerList>();
customers.Add(new Customer());
LastCall.Repeat.Once().IgnoreArguments();
mockRepository.ReplayAll();
customers.Add(new Customer());
mockRepository.VerifyAll();
}
In questo caso abbiamo detto che ci aspettiamo una sola chiamata del metodo Add e non ci interessa il valore dei parametri.