Vejledning til ReflectionTestUtils til enhedstest
1. Introduktion
ReflectionTestUtils er en del af Spring Test Context framework. Det er en samling til refleksionsbaserede hjælpemetoder, der bruges i en enhed, og integrationstestscenarier for at indstille ikke-offentlige felter, påberåbe ikke-offentlige metoder og injicere afhængigheder.
I denne vejledning ser vi på, hvordan vi kan bruge ReflectionTestUtils i enhedstest ved at gennemgå flere eksempler.
2. Maven-afhængigheder
Lad os starte med at tilføje de nyeste versioner af alle nødvendige afhængigheder, der er nødvendige for vores eksempler, til vores pom.xml:
org.springframework spring-context 5.1.2.RELEASE org.springframework spring-test 5.1.2.RELEASE test
Det seneste spring-context, spring-test afhængigheder kan downloades fra Maven Central repository.
3. Brug ReflectionTestUtils at indstille en værdi af et ikke-offentligt felt
Antag, at vi skal bruge en forekomst af en klasse, der har et privat felt uden en offentlig setter-metode i vores enhedstest.
Lad os starte med at oprette det:
offentlig klassemedarbejder {privat heltal id; privat strengnavn; // standard getters / setters}
Normalt har vi ikke adgang til det private felt id at tildele en værdi til testning, fordi der ikke er en offentlig setter-metode til den.
Vi kan derefter bruge ReflectionTestUtils.setField metode til at tildele en værdi til det private medlem id:
@Test offentlig ugyldig nårNonPublicField_thenReflectionTestUtilsSetField () {Medarbejdermedarbejder = ny medarbejder (); ReflectionTestUtils.setField (medarbejder, "id", 1); assertTrue (medarbejder.getId (). er lig med (1)); }
4. Brug ReflectionTestUtils at påkalde en ikke-offentlig metode
Lad os nu forestille os, at vi har en privat metode medarbejderToString i Medarbejder klasse:
private String-medarbejderToString () {return "id:" + getId () + "; navn:" + getName (); }
Vi kan skrive en enhedstest til medarbejderToString metode som nedenfor, selvom den ikke har adgang uden for en Medarbejder klasse:
@Test offentlig ugyldig nårNonPublicMethod_thenReflectionTestUtilsInvokeMethod () {Medarbejdermedarbejder = ny medarbejder (); ReflectionTestUtils.setField (medarbejder, "id", 1); medarbejder.setnavn ("Smith, John"); assertTrue (ReflectionTestUtils.invokeMethod (medarbejder, "medarbejderToString") .equals ("id: 1; navn: Smith, John")); }
5. Brug ReflectionTestUtils at injicere afhængigheder
Lad os sige, at vi ønsker at skrive en enhedstest for den følgende Spring-komponent, der har et privat felt med @Autowired kommentar:
@Komponent offentlig klasse EmployeeService {@Autowired privat HRService hrService; public String findEmployeeStatus (Integer employeeId) {return "Medarbejder" + medarbejderId + "status:" + hrService.getEmployeeStatus (medarbejderId); }}
Vi kan nu implementere HRService komponent som nedenfor:
@Komponent offentlig klasse HRService {public String getEmployeeStatus (Integer employeeId) {return "Inactive"; }}
Lad os desuden oprette en mock implementering til HRService klasse ved hjælp af Mockito. Vi sprøjter denne mock i Medarbejderstjeneste eksempel, og vi bruger det i vores enhedstest:
HRService hrService = mock (HRService.class); når (hrService.getEmployeeStatus (medarbejder.getId ())). derefterReturn ("Aktiv");
Fordi hrService er et privat felt uden en offentlig setter, vi bruger ReflectionTestUtils.setField metode til at injicere den mock, vi oprettede ovenfor, i dette private felt.
EmployeeService employeeService = ny EmployeeService (); ReflectionTestUtils.setField (medarbejderService, "hrService", hrService);
Endelig vil vores enhedstest se ud som dette:
@Test offentlig ugyldig nårInjectingMockOfDependency_thenReflectionTestUtilsSetField () {Medarbejdermedarbejder = ny medarbejder (); ReflectionTestUtils.setField (medarbejder, "id", 1); medarbejder.setnavn ("Smith, John"); HRService hrService = mock (HRService.class); når (hrService.getEmployeeStatus (medarbejder.getId ())). derefterReturn ("Aktiv"); EmployeeService employeeService = ny EmployeeService (); // Injicer mock i det private felt ReflectionTestUtils.setField (medarbejderService, "hrService", hrService); assertEquals ("Medarbejder" + medarbejder.getId () + "status: Aktiv", medarbejderService.findMedarbejderstatus (medarbejder.getId ())); }
Vi skal bemærke, at denne teknik er en løsning på det faktum, at vi bruger feltinjektion i vores bønneklasse. Hvis vi skiftede til konstruktionsinjektion, ville denne tilgang ikke være nødvendig.
6. Konklusion
I denne vejledning viste vi, hvordan du bruger ReflectionTestUtils i enhedstest ved at gennemgå flere eksempler.
Kodeprøver kan som altid findes på Github.