Jarné testovanie jednotky JdbcTemplate
1. Prehľad
Jar JdbcTemplate je mocný nástroj pre vývojárov, ktorí sa zameriavajú na písanie dotazov SQL a extrakciu výsledkov. Pripojí sa k back-endovej databáze a vykoná dotazy SQL priamo.
Preto môžeme pomocou integračných testov zabezpečiť, aby sme mohli správne vytiahnuť údaje z databázy. Môžeme tiež písať jednotkové testy na kontrolu správnosti súvisiacich funkcií.
V tomto výučbe si ukážeme, ako testovať jednotky JdbcTemplate kód.
2. JdbcTemplate a spustenie dotazov
Najskôr začnime s triedou DAO (Data Access Object), ktorá používa JdbcTemplate:
verejná trieda EmployeeDAO {private JdbcTemplate jdbcTemplate; public void setDataSource (DataSource dataSource) {jdbcTemplate = nový JdbcTemplate (dataSource); } public int getCountOfEmployees () {return jdbcTemplate.queryForObject ("SELECT COUNT (*) FROM EMPLOYEE", Integer.class); }}
Závislosť-vstrekujeme a Dátový zdroj predmet do EmployeeDAO trieda. Potom vytvoríme JdbcTemplate objekt v metóde setter. Tiež používame JdbcTemplate v príkladnej metóde getCountOfEmployees ().
Existujú dva spôsoby, ako jednotkové testovacie metódy použiť JdbcTemplate.
Ako zdroj údajov na testovanie môžeme použiť databázu v pamäti, napríklad databázu H2. V aplikáciách v reálnom svete však mohol mať dotaz SQL komplikované vzťahy a na otestovanie príkazov SQL musíme vytvoriť zložité inštalačné skripty.
Prípadne môžeme tiež zosmiešniť JdbcTemplate objekt na otestovanie funkčnosti metódy.
3.Test jednotky s databázou H2
Môžeme vytvoriť zdroj údajov, ktorý sa pripája k databáze H2, a vložiť ho do EmployeeDAO trieda:
@Test public void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount () {DataSource dataSource = new EmbeddedDatabaseBuilder (). SetType (EmbeddedDatabaseType.H2) .addScript ("classpath: jdbc / schema.sql") data) .build (); EmployeeDAO employeeDAO = nový EmployeeDAO (); employeeDAO.setDataSource (dataSource); assertEquals (4, employeeDAO.getCountOfEmployees ()); }
V tomto teste najskôr skonštruujeme zdroj údajov v databáze H2. Počas stavby vykonávame schema.sql vytvoriť ZAMESTNANEC tabuľka:
CREATE TABLE EMPLOYEE (ID int NOT NULL PRIMARY KEY, FIRST_NAME varchar (255), LAST_NAME varchar (255), ADDRESS varchar (255));
Tiež bežíme test-data.sql pridať testovacie údaje do tabuľky:
VLOŽTE DO HODNOTY ZAMESTNANCOV (1, „James“, „Gosling“, „Kanada“); VLOŽTE DO HODNOTY ZAMESTNANCOV (2, „Donald“, „Knuth“, „USA“); VLOŽTE DO HODNOTY ZAMESTNANCOV (3, 'Linus', 'Torvalds', 'Fínsko'); VLOŽTE DO HODNOTY ZAMESTNANCOV (4, 'Dennis', 'Ritchie', 'USA');
Potom môžeme tento zdroj údajov vložiť do súboru EmployeeDAO triedy a otestovať getCountOfEmployees metóda cez databázu H2 v pamäti.
4.Test jednotky s simulovaným objektom
Môžeme sa vysmievať JdbcTemplate objekt, aby sme nemuseli spúšťať príkaz SQL v databáze:
verejná trieda EmployeeDAOUnitTest {@Mock JdbcTemplate jdbcTemplate; @Test public void whenMockJdbcTemplate_thenReturnCorrectEmployeeCount () {EmployeeDAO employeeDAO = new EmployeeDAO (); ReflectionTestUtils.setField (employeeDAO, "jdbcTemplate", jdbcTemplate); Mockito.when (jdbcTemplate.queryForObject ("SELECT COUNT (*) FROM EMPLOYEE", Integer.class)) .thenReturn (4); assertEquals (4, employeeDAO.getCountOfEmployees ()); }}
V tomto jednotkovom teste najskôr vyhlásime falošnú správu JdbcTemplate objekt s @Mock anotácia. Potom ho injikujeme do EmployeeDAO objekt pomocou ReflectionTestUtils. Používame tiež Mockito nástroj na zosmiešnenie výsledku vrátenia súboru JdbcTemplate dopyt. To nám umožňuje otestovať funkčnosť getCountOfEmployees metóda bez pripojenia k databáze.
Pri zosmiešňovaní používame presnú zhodu v reťazci príkazov SQL JdbcTemplate dopyt. V aplikáciách v reálnom svete môžeme vytvárať zložité reťazce SQL a je ťažké urobiť presnú zhodu. Preto môžeme použiť aj anyString () metóda na obídenie kontroly reťazca:
Mockito.when (jdbcTemplate.queryForObject (Mockito.anyString (), Mockito.eq (Integer.class))) .thenReturn (3); assertEquals (3, employeeDAO.getCountOfEmployees ());
5. Spring Boot @JdbcTest
Nakoniec, ak používame Spring Boot, existuje anotácia, ktorú môžeme použiť na zavedenie testu s databázou H2 a JdbcTemplate fazuľa: @JdbcTest.
Vytvorme testovaciu triedu s touto anotáciou:
@JdbcTest @Sql ({"schema.sql", "test-data.sql"}) trieda EmployeeDAOIntegrationTest {@Autowired private JdbcTemplate jdbcTemplate; @Test void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount () {EmployeeDAO employeeDAO = new EmployeeDAO (); employeeDAO.setJdbcTemplate (jdbcTemplate); assertEquals (4, employeeDAO.getCountOfEmployees ()); }}
Môžeme si tiež všimnúť prítomnosť @Sql anotácia, ktorá nám umožňuje určiť súbory SQL, ktoré sa majú spustiť pred testom.
6. Záver
V tomto tutoriáli sme si ukázali niekoľko spôsobov testovania jednotiek JdbcTemplate.
Zdrojový kód článku je ako vždy k dispozícii na stránkach GitHub.