Våren JdbcTemplate Unit Testing

1. Oversikt

Vår JdbcTemplate er et kraftig verktøy for utviklere å fokusere på å skrive SQL-spørsmål og trekke ut resultater. Den kobles til back-end-databasen og utfører SQL-spørringer direkte.

Derfor kan vi bruke integrasjonstester for å sikre at vi kan hente data fra databasen riktig. Vi kan også skrive enhetstester for å kontrollere riktigheten av de relaterte funksjonene.

I denne opplæringen viser vi hvordan du kan teste enheten JdbcTemplate kode.

2. JdbcTemplate og kjører spørsmål

For det første, la oss starte med en DAO-klasse (Data Access Object) som bruker JdbcTemplate:

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

Vi avhengighet-injisere en Datakilde objekt inn i MedarbeiderDAO klasse. Deretter lager vi JdbcTemplate objekt i settermetoden. Også bruker vi JdbcTemplate i en eksempelmetode getCountOfEmployees ().

Det er to måter å bruke enhetstestmetoder på JdbcTemplate.

Vi kan bruke en minnedatabase som H2-databasen som datakilde for testing. Imidlertid, i virkelige applikasjoner, kan SQL-spørringen ha kompliserte forhold, og vi må lage komplekse oppsettskript for å teste SQL-setningene.

Alternativt kan vi også spotte JdbcTemplate motsette seg for å teste metodefunksjonaliteten.

3.Enhetstest med H2-database

Vi kan opprette en datakilde som kobles til H2-databasen og injisere den i MedarbeiderDAO klasse:

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

I denne testen konstruerer vi først en datakilde på H2-databasen. Under konstruksjonen utfører vi schema.sql å lage ANSATT bord:

OPPRETT TABELL MEDARBEIDER (ID int IKKE NULL PRIMÆR NØKKEL, FIRST_NAME varchar (255), LAST_NAME varchar (255), ADRESS varchar (255));

Dessuten løper vi test-data.sql for å legge til testdata i tabellen:

INSETTE I ANSATTEVERDIER (1, 'James', 'Gosling', 'Canada'); INSETT I ANSATTEVERDIER (2, 'Donald', 'Knuth', 'USA'); INNSETT I ANSATTEVERDIER (3, 'Linus', 'Torvalds', 'Finland'); INSETT I ANSATTEVÆRDIER (4, 'Dennis', 'Ritchie', 'USA');

Deretter kan vi injisere denne datakilden i MedarbeiderDAO klasse og teste getCountOfEmployees metode over H2-databasen i minnet.

4.Enhetstest med mock-objekt

Vi kan spotte JdbcTemplate objekt slik at vi ikke trenger å kjøre SQL-setningen på en database:

offentlig klasse AnsattDAOUnitTest {@Mock JdbcTemplate jdbcTemplate; @Test offentlig ugyldig nårMockJdbcTemplate_thenReturnCorrectEmployeeCount () {EmployeeDAO medarbeiderDAO = ny EmployeeDAO (); ReflectionTestUtils.setField (medarbeiderDAO, "jdbcTemplate", jdbcTemplate); Mockito.when (jdbcTemplate.queryForObject ("VELG TELL (*) FRA MEDARBEIDER, Integer.class)) .thenReturn (4); assertEquals (4, ansatteDAO.getCountOfEmployees ()); }}

I denne enhetstesten erklærer vi først en hån JdbcTemplate objekt med @Håne kommentar. Så sprøyter vi den inn i MedarbeiderDAO objektet bruker ReflectionTestUtils. Også bruker vi Mockito verktøy for å spotte returresultatet av JdbcTemplate spørsmål. Dette lar oss teste funksjonaliteten til getCountOfEmployees metode uten å koble til en database.

Vi bruker en nøyaktig samsvar på SQL-setningsstrengen når vi håner JdbcTemplate spørsmål. I virkelige applikasjoner kan vi lage komplekse SQL-strenger, og det er vanskelig å gjøre en nøyaktig samsvar. Derfor kan vi også bruke anyString () metode for å omgå strengkontrollen:

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

5. Spring Boot @JdbcTest

Til slutt, hvis vi bruker Spring Boot, er det en kommentar vi kan bruke til å starte en test med en H2-database og en JdbcTemplate bønne: @JdbcTest.

La oss lage en testklasse med denne kommentaren:

@JdbcTest @Sql ({"schema.sql", "test-data.sql"}) klasse EmployeeDAOIntegrationTest {@Autowired private JdbcTemplate jdbcTemplate; @Test ugyldig nårInjectInMemoryDataSource_thenReturnCorrectEmployeeCount () {EmployeeDAO medarbeiderDAO = ny EmployeeDAO (); ansattDAO.setJdbcTemplate (jdbcTemplate); assertEquals (4, ansatteDAO.getCountOfEmployees ()); }}

Vi kan også merke tilstedeværelsen av @Sql kommentar som lar oss spesifisere SQL-filene som skal kjøres før testen.

6. Konklusjon

I denne opplæringen viste vi flere måter å enhetstest på JdbcTemplate.

Som alltid er kildekoden for artikkelen tilgjengelig på GitHub.


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