Van Mock naar Duidelijke en Precieze Communicatie
Ik weet het, tegenwoordig wordt alles een “mock” genoemd. Je schrijft tests met een mocking‑framework, die stand‑in objecten maakt om afhankelijkheden te vervangen. En die worden allemaal mocks genoemd.
Maar een mock is slechts één soort test-double. In werkelijkheid hebben we
Dummies, Stubs, Spies,
Mocks en Fakes. Door alles “mock” te noemen,
verberg je het werkelijke doel van het specifieke test‑double.
Stel dat we willen testen of een methode een ArgumentException gooit. De te testen class vereist dat er een datarepository wordt geïnjecteerd, maar de exception moet al worden gegooid voordat de repository überhaupt wordt gebruikt. In dat geval is de repository irrelevant voor onze test.
In plaats van:
// Arrange
var mock = CreateMock<IRepository>();
InsertOrderHandler handler = new(mock)kunnen we onze intentie duidelijker maken door een dummy te gebruiken:
// Arrange
var dummy = CreateMock<IRepository>();
InsertOrderHandler handler = new(dummy)Opmerking: Ik gebruik hier
CreateMock<IRepository>()als voorbeeld voor welk framework er ook gebruikt wordt.
Nu een scenario waarin de repository wél van belang is. Onze test heeft specifieke data uit de repository nodig om te slagen.
// Arrange
var mock = CreateMock<IRepository>();
GetOrderHandler handler = new(mock)We kunnen duidelijk maken dat de repository nodig is voor het slagen van de test:
// Arrange
var stub = CreateMock<IRepository>();
GetOrderHandler handler = new(stub)Of een scenario waarin we willen controleren dat de juiste data naar de database wordt geschreven:
// Arrange
var spy = CreateMock<IRepository>();
InsertOrderHandler handler = new(spy)
Order order = CreateValidOrder();
// Act
handler.Handle(validOrder);
// Assert
Assert.Equal(123, spy.InsertedOrders[0].CustomerId)Een mock is vergelijkbaar met een spy, maar dan mét ingebouwde verwachtingen: er wordt gecontroleerd dat bepaalde calls exact volgens specificatie zijn uitgevoerd. Deze verificatie gebeurt in de Assert‑fase.
// Assert
mock.Verify(r => r.Insert(validOrder));De verificatie wordt hier uitgevoerd door het mocking‑framework, niet door expliciete assertions in de test. Dit verbergt de validatielogica voor de lezer. Die moet de setup en de Verify‑aanroep van de mock begrijpen om te weten wat er precies getest wordt.
Door de juiste naam voor je test-double te kiezen verbetert je de duidelijkheid, en bedoelingen van je test helder. Het toont vakmanschap.