Spring JdbcTemplate Unit testen

1. Overzicht

Voorjaar JdbcTemplate is een krachtig hulpmiddel voor ontwikkelaars om zich te concentreren op het schrijven van SQL-query's en het extraheren van resultaten. Het maakt verbinding met de back-enddatabase en voert rechtstreeks SQL-query's uit.

Daarom kunnen we integratietests gebruiken om ervoor te zorgen dat we de gegevens op de juiste manier uit de database kunnen halen. Ook kunnen we unit tests schrijven om de juistheid van de gerelateerde functionaliteiten te controleren.

In deze zelfstudie laten we zien hoe u een eenheidstest kunt uitvoeren JdbcTemplate code.

2. JdbcTemplate en Query's uitvoeren

Laten we eerst beginnen met een DAO-klasse (data access object) die gebruikmaakt van JdbcTemplate:

openbare klasse EmployeeDAO {privé JdbcTemplate jdbcTemplate; openbare ongeldige setDataSource (DataSource dataSource) {jdbcTemplate = nieuwe JdbcTemplate (dataSource); } public int getCountOfEmployees () {return jdbcTemplate.queryForObject ("SELECTEER AANTAL (*) VAN WERKNEMER", Geheel getal.klasse); }}

We afhankelijkheid-injecteren een Databron object in het MedewerkerDAO klasse. Vervolgens maken we het JdbcTemplate object in de setter-methode. We gebruiken ook JdbcTemplate in een voorbeeldmethode getCountOfEmployees ().

Er zijn twee manieren om eenheidstestmethoden te gebruiken die gebruik maken van JdbcTemplate.

We kunnen een in-memory database zoals de H2-database gebruiken als de gegevensbron om te testen. In praktijktoepassingen kan de SQL-query echter gecompliceerde relaties hebben en moeten we complexe installatiescripts maken om de SQL-instructies te testen.

Als alternatief kunnen we ook de JdbcTemplate object om de functionaliteit van de methode te testen.

3.Unit-test met H2-database

We kunnen een gegevensbron maken die verbinding maakt met de H2-database en deze in het MedewerkerDAO klasse:

@Test openbare leegte whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount () {DataSource dataSource = nieuwe EmbeddedDatabaseBuilder (). SetType (EmbeddedDatabaseType.H2) .addScript ("classpath: jdbc / schema.sqdb"). .bouwen(); MedewerkerDAO medewerkerDAO = nieuwe medewerkerDAO (); medewerkerDAO.setDataSource (dataSource); assertEquals (4, employeeDAO.getCountOfEmployees ()); }

In deze test bouwen we eerst een gegevensbron op de H2-database. Tijdens de bouw voeren wij uit schema.sql om het WERKNEMER tafel:

TABEL WERKNEMER MAKEN (ID int NOT NULL PRIMAIRE SLEUTEL, FIRST_NAME varchar (255), LAST_NAME varchar (255), ADRES varchar (255));

We rennen ook test-data.sql om testgegevens aan de tabel toe te voegen:

INVOEGEN IN WERKNEMERSWAARDEN (1, 'James', 'Gosling', 'Canada'); INVOEGEN IN WERKNEMERSWAARDEN (2, 'Donald', 'Knuth', 'VS'); INVOEGEN IN WERKNEMERSWAARDEN (3, 'Linus', 'Torvalds', 'Finland'); INVOEGEN IN WERKNEMERSWAARDEN (4, 'Dennis', 'Ritchie', 'VS');

Vervolgens kunnen we deze gegevensbron in het MedewerkerDAO klasse en test het getCountOfEmployees methode via de H2-database in het geheugen.

4.Eenheidstest met mock-object

We kunnen de spot drijven met JdbcTemplate object zodat we de SQL-instructie niet op een database hoeven uit te voeren:

openbare klasse EmployeeDAOUnitTest {@Mock JdbcTemplate jdbcTemplate; @ Test openbare ongeldig whenMockJdbcTemplate_thenReturnCorrectEmployeeCount () {EmployeeDAO employeeDAO = nieuwe EmployeeDAO (); ReflectionTestUtils.setField (employeeDAO, "jdbcTemplate", jdbcTemplate); Mockito.when (jdbcTemplate.queryForObject ("SELECTEER AANTAL (*) VAN WERKNEMER", Geheel getal.klasse)) .thenReturn (4); assertEquals (4, employeeDAO.getCountOfEmployees ()); }}

In deze unit-test verklaren we eerst een mock JdbcTemplate object met de @Bespotten annotatie. Vervolgens injecteren we het in de MedewerkerDAO object gebruiken ReflectionTestUtils. We gebruiken ook de Mockito hulpprogramma om het geretourneerde resultaat van de JdbcTemplate vraag. Dit stelt ons in staat om de functionaliteit van het getCountOfEmployees methode zonder verbinding te maken met een database.

We gebruiken een exacte match voor de SQL-statement string als we de JdbcTemplate vraag. In real-world applicaties kunnen we complexe SQL-strings maken, en het is moeilijk om een ​​exacte match te maken. Daarom kunnen we ook de anyString () methode om de stringcontrole te omzeilen:

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

5. Spring Boot @JdbcTest

Ten slotte, als we Spring Boot gebruiken, is er een annotatie die we kunnen gebruiken om een ​​test op te starten met een H2-database en een JdbcTemplate Boon: @JDbcTest.

Laten we een testklasse maken met deze annotatie:

@JdbcTest @Sql ({"schema.sql", "test-data.sql"}) klasse EmployeeDAOIntegrationTest {@Autowired private JdbcTemplate jdbcTemplate; @Test ongeldig whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount () {EmployeeDAO employeeDAO = nieuwe EmployeeDAO (); medewerkerDAO.setJdbcTemplate (jdbcTemplate); assertEquals (4, employeeDAO.getCountOfEmployees ()); }}

We kunnen ook de aanwezigheid van de @Sql annotatie waarmee we de SQL-bestanden kunnen specificeren die vóór de test moeten worden uitgevoerd.

6. Conclusie

In deze zelfstudie hebben we meerdere manieren laten zien om unit-tests uit te voeren JdbcTemplate.

Zoals altijd is de broncode voor het artikel beschikbaar op GitHub.