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.