Vraag Spottende objecten - alle methoden declareren als virtueel of interface gebruiken?


In .net zijn de methoden, in tegenstelling tot in Java, standaard niet virtueel. Om de meeste mock-objectraamwerken te kunnen gebruiken, moet je de methoden die je op je mock wilt gebruiken markeren als virtueel op het `echte 'object, of moet je een interface hebben die je kunt bespotten dat de klasse die getest wordt accepteren in plaats van de implementatie.

Het lijkt een slechte vorm om te gaan en elke methode als virtueel te markeren, maar het lijkt ook een slechte vorm om een ​​interface voor elke afzonderlijke klasse te definiëren.

Wat is het beste om te doen?


11
2018-03-27 22:47


oorsprong


antwoorden:


Mijn vuistregel is om de interface te definiëren als ik verwacht meerdere implementaties te hebben, ofwel concrete concrete toepassingsklassen of een enkele applicatie-implementatie en een nep-implementatie voor unit testing. Als ik alleen een enkele implementatie verwacht en de klasse niet hoeft te faken (de meeste niet), dan ga ik de virtuele methode route en refactor naar een interface als dat nodig is.


9
2018-03-27 22:58



Als ik tussen de twee moet kiezen, zou ik me inlaten met het interface-aspect. Een interface is bedoeld om een ​​contract te definiëren, wat in feite is waar een schijnobject aan vasthoudt. Het markeren van een methode als virtueel kan onverwachte bijwerkingen hebben. Het beïnvloedt het ontwerp van de werkelijke klasse die bespot wordt. Een interface definieert alleen de namen van de methoden en heeft geen effect op de echte klasse.


10
2018-03-27 22:50



Wie zegt dat je een mock-object moet afleiden uit dezelfde klassehiërarchie?

Het is veel eenvoudiger om een ​​eenvoudige zelfstandige klasse te maken met de benodigde interface en exemplaren van dat object te maken.

U kunt zelfs een hiërarchie van schijncursussen maken en die gebruiken voor het testen van eenheden.


0
2018-03-27 22:49



Het beste is om je hoofd te gebruiken. Denk aan uw scenario, als het logischer is om virtueel te gebruiken, doe dat dan. Als echter een interface beter geschikt is voor uw taak, doe dat dan.

Dus echt zie ik het als dit in het toevoegen van nieuwe functionaliteit

  • Inheritence: gebruik virtuele methoden.
  • Samenstelling: gebruik interfaces.

Ik weet zeker dat hier een aantal kanttekeningen bij staan. Dus gebruik gewoon uw hoofd en doe wat het gemakkelijkst is in uw scenario.


-1