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.


$config[zx-auto] not found$config[zx-overlay] not found