Hvordan endre en statisk klasse til en dynamisk singleton

Har du arvet kode fra noen andre? Er det ingen tester på kodebasen? Er all koden limt fast sammen med kall på statiske metoder som ikke lar seg erstatte med mocker i testene dine?
Det er mulig å gjøre en disiplinert refaktorisering fra denne situasjonen til et mockbart design der alle kallene går via en singleton som kan erstattes under testing. Her er en oppskrift for å endre en statisk klasse til en singleton:
  1. Gitt at den originale klassen heter StaticService. Kopier klassen til en ny klasse som blir implementasjonsklassen, for eksempel kallt ServiceImplementation
  2. ServiceImplementation trenger å kun ha ikke-statiske metoder. Dette er lett å fikse ved en tekstlig «søk/erstatt» av «public static» med «public». Normalt vil dette søket kun treffe metodene som du trenger, men det er mulig du må ettergå steget for hånd.
  3. For å kunne mocke ut ServiceImplementation er det kjekt å ha et interface, for eksempel kallt ServiceInterface. Din IDE har antageligvis innebygget støtte for dette. Se etter «Extract Interface» i Refactoring menyen.
  4. La en ny klasse ServiceDelegator som skal erstatte StaticService.  Legg til en private static felt til ServiceInterface. I code menyen til IDEA og i Source menyen finnes valget «(Generate) Delegate methods». IDEA gjør disse metodene static dersom feltet er static, men det gjør dessverre ikke Eclipse. I Eclipse må man bruke «søk/erstatt» for å legge til «static» (erstatt «public» med «public static», men pass opp for «public class» i toppen av filen)
  5. Så kommer det skumle. Slett StaticService og omdøp ServiceDelegator til static service. Her vil refactoringstøtten i IDE’en din virke mot deg. All koden burde nå fortsatt kompilere uten endring.
  6. Så er det bare å gjøre instansfeltet i servicen aksesserbart av testene (for eksempel med en setter) og du kan mocke ut ServiceInterface til hjertens lyst og glede

Lykke til med ditt testbare prosjekt!

Legg igjen en kommentar