Spring JdbcTemplate Unit Testing

1. Oversigt

Forår JdbcTemplate er et kraftfuldt værktøj for udviklere til at fokusere på at skrive SQL-forespørgsler og udtrække resultater. Det opretter forbindelse til back-end-databasen og udfører SQL-forespørgsler direkte.

Derfor kan vi bruge integrationstest for at sikre, at vi kan hente data korrekt fra databasen. Vi kan også skrive enhedstest for at kontrollere rigtigheden af ​​de relaterede funktioner.

I denne vejledning viser vi, hvordan man enhedstest JdbcTemplate kode.

2. JdbcTemplate og kørende forespørgsler

Lad os først starte med et dataadgangsobjekt (DAO) -klasse, der bruger JdbcTemplate:

offentlig klasse EmployeeDAO {private JdbcTemplate jdbcTemplate; offentlig ugyldighed setDataSource (DataSource dataSource) {jdbcTemplate = ny JdbcTemplate (dataSource); } public int getCountOfEmployees () {return jdbcTemplate.queryForObject ("SELECT COUNT (*) FROM EMPLOYEE", Integer.class); }}

Vi afhænger af - injicerer Datakilde objekt ind i MedarbejderDAO klasse. Derefter opretter vi JdbcTemplate objekt i setter-metoden. Også bruger vi JdbcTemplate i en eksempelmetode getCountOfEmployees ().

Der er to måder at bruge enhedstestmetoder på JdbcTemplate.

Vi kan bruge en in-memory-database, såsom H2-databasen, som datakilde til test. Imidlertid i SQL-applikationer kan SQL-forespørgslen have komplicerede forhold, og vi er nødt til at oprette komplekse opsætningsskripter for at teste SQL-sætningerne.

Alternativt kan vi også spotte JdbcTemplate modsætter sig at teste metodefunktionaliteten.

3.Enhedstest med H2-database

Vi kan oprette en datakilde, der opretter forbindelse til H2-databasen og injicerer den i MedarbejderDAO klasse:

@Test offentlig ugyldigt nårInjectInMemoryDataSource_thenReturnCorrectEmployeeCount () {DataSource dataSource = new EmbeddedDatabaseBuilder (). SetType (EmbeddedDatabaseType.H2) .addScript ("classpath: jdbc / schema.sql"). .build (); EmployeeDAO medarbejderDAO = ny EmployeeDAO (); medarbejderDAO.setDataSource (dataSource); assertEquals (4, medarbejderDAO.getCountOfEmployees ()); }

I denne test konstruerer vi først en datakilde på H2-databasen. Under konstruktionen udfører vi skema.sql at oprette MEDARBEJDER bord:

OPRET TABEL MEDARBEJDER (ID int IKKE NULL PRIMÆR NØGLE, FIRST_NAME varchar (255), LAST_NAME varchar (255), ADRESS varchar (255));

Vi løber også test-data.sql for at tilføje testdata i tabellen:

INDSÆT I MEDARBEJDSVÆRDIER (1, 'James', 'Gosling', 'Canada'); INDSÆT I MEDARBEJDSVÆRDIER (2, 'Donald', 'Knuth', 'USA'); INDSÆT I MEDARBEJDERS VÆRDIER (3, 'Linus', 'Torvalds', 'Finland'); INDSÆT I MEDARBEJDSVÆRDIER (4, 'Dennis', 'Ritchie', 'USA');

Derefter kan vi indsprøjte denne datakilde i MedarbejderDAO klasse og teste getCountOfEmployees metode over H2-databasen i hukommelsen.

4.Enhedstest med narret objekt

Vi kan spotte JdbcTemplate objekt, så vi ikke behøver at køre SQL-sætningen på en database:

offentlig klasse MedarbejderDAOUnitTest {@Mock JdbcTemplate jdbcTemplate; @Test offentlig ugyldigt nårMockJdbcTemplate_thenReturnCorrectEmployeeCount () {EmployeeDAO medarbejderDAO = ny EmployeeDAO (); ReflectionTestUtils.setField (medarbejderDAO, "jdbcTemplate", jdbcTemplate); Mockito.when (jdbcTemplate.queryForObject ("SELECT COUNT (*) FROM EMPLOYEE", Integer.class)) .thenReturn (4); assertEquals (4, medarbejderDAO.getCountOfEmployees ()); }}

I denne enhedstest erklærer vi først en mock JdbcTemplate objekt med @Mock kommentar. Så sprøjter vi det til MedarbejderDAO objekt ved hjælp af ReflectionTestUtils. Vi bruger også Mockito værktøj til at spotte returneringsresultatet af JdbcTemplate forespørgsel. Dette giver os mulighed for at teste funktionaliteten af getCountOfEmployees metode uden at oprette forbindelse til en database.

Vi bruger en nøjagtig matchning på SQL-sætningsstrengen, når vi håner JdbcTemplate forespørgsel. I virkelige applikationer kan vi oprette komplekse SQL-strenge, og det er svært at lave en nøjagtig matchning. Derfor kan vi også bruge anyString () metode til at omgå strengkontrol:

Mockito.when (jdbcTemplate.queryForObject (Mockito.anyString (), Mockito.eq (Integer.class))). DerefterReturn (3); assertEquals (3, medarbejderDAO.getCountOfEmployees ());

5. Spring Boot @JdbcTest

Endelig, hvis vi bruger Spring Boot, er der en kommentar, vi kan bruge til at starte en test med en H2-database og en JdbcTemplate bønne: @JdbcTest.

Lad os oprette en testklasse med denne kommentar:

@JdbcTest @Sql ({"schema.sql", "test-data.sql"}) klasse MedarbejderDAOIntegrationTest {@Autowired privat JdbcTemplate jdbcTemplate; @Test ugyldigt nårInjectInMemoryDataSource_thenReturnCorrectEmployeeCount () {EmployeeDAO medarbejderDAO = ny EmployeeDAO (); medarbejderDAO.setJdbcTemplate (jdbcTemplate); assertEquals (4, medarbejderDAO.getCountOfEmployees ()); }}

Vi kan også bemærke tilstedeværelsen af @Sql kommentar, som giver os mulighed for at specificere de SQL-filer, der skal køres før testen.

6. Konklusion

I denne vejledning viste vi flere måder at enhedstest på JdbcTemplate.

Som altid er kildekoden til artiklen tilgængelig på GitHub.


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